sys.dm_db_stats_histogram (Transact-SQL)
Gilt für: SQL Server 2016 (13.x) und höher Azure SQL-Datenbank Azure SQL Managed Instance
Gibt das Statistik-Histogramm für das angegebene Datenbankobjekt (Tabelle oder indizierte Ansicht) in der aktuellen SQL Server-Datenbank zurück. Vergleichbar zu DBCC SHOW_STATISTICS WITH HISTOGRAM
.
Hinweis
Das DMF ist ab SQL Server 2016 (13.x) SP1 CU2 verfügbar
Syntax
sys.dm_db_stats_histogram (object_id, stats_id)
Argumente
object_id
ID des Objekts in der aktuellen Datenbank, für die Eigenschaften einer der enthaltenen Statistiken angefordert werden. object_id ist int.
stats_id
ID der Statistik für die angegebene object_id. Die Statistik-ID kann aus der dynamischen Verwaltungssicht sys.stats abgerufen werden. stats_id ist int.
Zurückgegebene Tabelle
Spaltenname | Datentyp | BESCHREIBUNG |
---|---|---|
object_id | int | ID des Objekts (Tabelle oder indizierte Sicht), für das die Eigenschaften des Statistikobjekts zurückgegeben werden sollen. |
stats_id | int | Die ID des Statistikobjekts. Diese ist innerhalb der Tabelle oder indizierten Sicht eindeutig. Weitere Informationen finden Sie unter sys.stats (Transact-SQL). |
step_number | int | Anzahl der Schritte im Histogramm. |
range_high_key | sql_variant | Oberer Spaltengrenzwert für einen Histogrammschritt. Der Spaltenwert wird auch als Schlüsselwert bezeichnet. |
range_rows | real | Geschätzte Anzahl von Zeilen, deren Spaltenwerte innerhalb eines Histogrammschritts liegen, ohne den oberen Grenzwert. |
equal_rows | real | Geschätzte Anzahl von Zeilen, deren Spaltenwerte der Obergrenze des Histogrammschritts entsprechen. |
distinct_range_rows | bigint | Geschätzte Anzahl von Zeilen mit einem unterschiedlichen Spaltenwert innerhalb eines Histogrammschritts ohne den oberen Grenzwert. |
average_range_rows | real | Durchschnittliche Anzahl von Zeilen mit einem duplizierten Spaltenwert innerhalb eines Histogrammschritts ohne den oberen Grenzwert (RANGE_ROWS / DISTINCT_RANGE_ROWS für DISTINCT_RANGE_ROWS > 0 ). |
Hinweise
Das Resultset für sys.dm_db_stats_histogram
gibt Informationen zurück, die DBCC SHOW_STATISTICS WITH HISTOGRAM
ähnlich sind und auch object_id
, stats_id
und step_number
enthalten.
Da es sich bei der Spalte range_high_key
um einen sql_variant-Datentyp handelt, müssen Sie eventuell CAST
oder CONVERT
verwenden, wenn ein Prädikat einen Vergleich mit einer Nicht-Zeichenketten-Konstante durchführt.
Histogramm
Ein Histogramm misst die Häufigkeit des Vorkommens für jeden unterschiedlichen Wert in einem Dataset. Der Abfrageoptimierer berechnet ein Histogramm für die Spaltenwerte in der ersten Schlüsselspalte des Statistikobjekts und wählt die Spaltenwerte aus, indem statistische Zeilenstichproben entnommen werden oder indem ein vollständiger Scan aller Zeilen in der Tabelle oder Sicht ausgeführt wird. Wenn das Histogramm anhand einer Gruppe von Zeilenstichproben erstellt wird, handelt es sich bei der gespeicherten Gesamtzahl von Zeilen und unterschiedlichen Werten um Schätzungen, die keine ganzen Zahlen sein müssen.
Zum Erstellen des Histogramms sortiert der Abfrageoptimierer die Spaltenwerte, berechnet die Anzahl der Werte, die den einzelnen unterschiedlichen Spaltenwerten entsprechen, und aggregiert die Spaltenwerte dann in maximal 200 zusammenhängenden Histogrammschritten. Jeder Schritt enthält einen Bereich von Spaltenwerten gefolgt von einem oberen Spaltengrenzwert. Der Bereich enthält alle möglichen Spaltenwerte zwischen den Begrenzungswerten, ohne die Begrenzungswerte selbst. Der niedrigste der sortierten Spaltenwerte ist der obere Grenzwert für den ersten Histogrammschritt.
Das folgende Diagramm zeigt ein Histogramm mit sechs Schritten. Der Bereich links vom ersten oberen Grenzwert ist der erste Schritt.
Für jeden Histogrammschritt gilt:
Eine fett formatierte Zeile stellt den oberen Grenzwert (range_high_key) und die Häufigkeit des Vorkommens (equal_rows) dar.
Der einfarbige Bereich links von range_high_key stellt den Bereich der Spaltenwerte und die durchschnittliche Häufigkeit des Vorkommens der einzelnen Spaltenwerte (average_range_rows) dar. average_range_rows ist für den ersten Histogrammschritt immer 0.
Gepunktete Linien stellen die als Stichprobe entnommenen Werte dar, die zum Schätzen der Gesamtanzahl der unterschiedlichen Werte im Bereich (distinct_range_rows) verwendet werden, sowie die Gesamtanzahl der Werte im Bereich (range_rows). Der Abfrageoptimierer verwendet range_rows und distinct_range_rows, um average_range_rows zu berechnen. Die als Stichprobe entnommenen Werte werden nicht gespeichert.
Der Abfrageoptimierer definiert die Histogrammschritte gemäß ihrer statistischen Bedeutung. Dabei wird ein Algorithmus für die maximale Differenz verwendet, um die Anzahl der Schritte im Histogramm zu minimieren und gleichzeitig die Differenz zwischen den Begrenzungswerten zu maximieren. Die maximale Anzahl von Schritten ist 200. Die Anzahl von Histogrammschritten kann geringer sein als die Anzahl unterschiedlicher Werte, auch bei Spalten mit weniger als 200 Grenzpunkten. Beispielsweise kann eine Spalte mit 100 unterschiedlichen Werten ein Histogramm mit weniger als 100 Grenzpunkten aufweisen.
Berechtigungen
Erfordert, dass der Benutzer über SELECT-Berechtigungen für Statistikspalten verfügt, Besitzer der Tabelle oder Mitglied der festen Serverrolle sysadmin
, der festen Datenbankrolle db_owner
oder der festen Datenbankrolle db_ddladmin
ist.
Beispiele
A. Einfaches Beispiel
Das folgende Beispiel erstellt und füllt eine einfache Tabelle. Anschließend werden Statistiken für die Country_Name
-Spalte erstellt.
CREATE TABLE Country
(Country_ID int IDENTITY PRIMARY KEY,
Country_Name varchar(120) NOT NULL);
INSERT Country (Country_Name) VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');
CREATE STATISTICS Country_Stats
ON Country (Country_Name) ;
Der Primärschlüssel belegt stat_id
Nummer 1, also rufen Sie sys.dm_db_stats_histogram
für stat_id
Nummer 2 auf, um das Statistikhistogramm für die Tabelle Country
zurückzugeben.
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Country'), 2);
B. Nützliche Abfrage:
SELECT hist.step_number, hist.range_high_key, hist.range_rows,
hist.equal_rows, hist.distinct_range_rows, hist.average_range_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'<statistic_name>';
C. Nützliche Abfrage:
Im folgenden Beispiel wird aus der Tabelle Country
mit einem Prädikat in Spalte Country_Name
ausgewählt.
SELECT * FROM Country
WHERE Country_Name = 'Canada';
Im folgenden Beispiel wird die zuvor erstellte Statistik in Tabelle Country
und Spalte Country_Name
für den Histogrammschritt betrachtet, der dem Prädikat in der obigen Abfrage entspricht.
SELECT ss.name, ss.stats_id, shr.steps, shr.rows, shr.rows_sampled,
shr.modification_counter, shr.last_updated, sh.range_rows, sh.equal_rows
FROM sys.stats ss
INNER JOIN sys.stats_columns sc
ON ss.stats_id = sc.stats_id AND ss.object_id = sc.object_id
INNER JOIN sys.all_columns ac
ON ac.column_id = sc.column_id AND ac.object_id = sc.object_id
CROSS APPLY sys.dm_db_stats_properties(ss.object_id, ss.stats_id) shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) sh
WHERE ss.[object_id] = OBJECT_ID('Country')
AND ac.name = 'Country_Name'
AND sh.range_high_key = CAST('Canada' AS CHAR(8));
Nächste Schritte
DBCC SHOW_STATISTICS (Transact-SQL)
Objektbezogene dynamische Verwaltungssichten und -funktionen (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL)