Freigeben über


sys.dm_db_stats_histogram (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und spätere Versionen Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

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

Die ID des Objekts in der aktuellen Datenbank, für die Eigenschaften einer seiner Statistiken angefordert werden. object_id ist int.

stats_id

Die ID der Statistiken 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.
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 möglicherweise einen Vergleich mit einer Nicht-Zeichenfolgenkonstante verwenden CAST oder CONVERT wenn ein Prädikat einen Vergleich 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 aus einer stichprobenierten Reihe von Zeilen erstellt wird, sind die gespeicherten Summen für die Anzahl der Zeilen und die Anzahl unterschiedlicher Werte Schätzungen und müssen nicht ganze Ganze Zahlen sein.

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.

Diagramm, wie ein Histogramm aus stichprobenierten Spaltenwerten berechnet wird.

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 und die stichprobenierten Werte nicht zu speichern.

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 auswahlberechtigungen für Statistikspalten verfügt oder der Benutzer die Tabelle besitzt oder der Benutzer Mitglied der festen Serverrolle "sysadmin ", der db_owner festen Datenbankrolle oder der db_ddladmin festen Datenbankrolle ist.

Beispiele

A. Einfaches Beispiel

Im folgenden Beispiel wird eine einfache Tabelle erstellt und aufgefüllt. Anschließend werden Statistiken für die Region_Name-Spalte erstellt.

CREATE TABLE Region
(
    Region_ID INT IDENTITY PRIMARY KEY,
    Region_Name VARCHAR (120) NOT NULL
);

INSERT Region (Region_Name)
VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Region_Stats ON Region(Region_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 Region zurückzugeben.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 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 Region mit einem Prädikat in Spalte Region_Nameausgewählt.

SELECT * FROM Region
WHERE Region_Name = 'Canada';

Im folgenden Beispiel wird die zuvor erstellte Statistik in Tabelle Region und Spalte Region_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 AS ss
     INNER JOIN sys.stats_columns AS sc
         ON ss.stats_id = sc.stats_id
        AND ss.object_id = sc.object_id
     INNER JOIN sys.all_columns AS 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) AS shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) AS sh
WHERE ss.[object_id] = OBJECT_ID('Region')
      AND ac.name = 'Region_Name'
      AND sh.range_high_key = CAST ('Canada' AS CHAR (8));