Sys. dm_db_stats_histogram (Transact-SQL)sys.dm_db_stats_histogram (Transact-SQL)

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Gibt das statistikhistogramm für das angegebene Datenbankobjekt (Tabelle oder indizierte Sicht) in der aktuellen SQL ServerSQL Server Datenbank.Returns the statistics histogram for the specified database object (table or indexed view) in the current SQL ServerSQL Server database. Ähnlich wie DBCC SHOW_STATISTICS WITH HISTOGRAM.Similar to DBCC SHOW_STATISTICS WITH HISTOGRAM.

Hinweis

Dieser DMF steht ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU2This DMF is available starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU2

SyntaxSyntax

sys.dm_db_stats_histogram (object_id, stats_id)  

ArgumenteArguments

object_idobject_id
ID des Objekts in der aktuellen Datenbank, für die Eigenschaften einer der enthaltenen Statistiken angefordert werden.Is the ID of the object in the current database for which properties of one of its statistics is requested. object_id ist int.object_id is int.

stats_idstats_id
ID der Statistik für die angegebene object_id.Is the ID of statistics for the specified object_id. Die Statistik-ID kann aus der dynamischen Verwaltungssicht sys.stats abgerufen werden.The statistics ID can be obtained from the sys.stats dynamic management view. stats_id ist int.stats_id is int.

Zurückgegebene TabelleTable Returned

SpaltennameColumn name DatentypData type BeschreibungDescription
object_idobject_id intint ID des Objekts (Tabelle oder indizierte Sicht), für das die Eigenschaften des Statistikobjekts zurückgegeben werden sollen.ID of the object (table or indexed view) for which to return the properties of the statistics object.
stats_idstats_id intint Die ID des Statistikobjekts.ID of the statistics object. Diese ist innerhalb der Tabelle oder indizierten Sicht eindeutig.Is unique within the table or indexed view. Weitere Informationen finden Sie unter sys.stats (Transact-SQL).For more information, see sys.stats (Transact-SQL).
step_numberstep_number intint Die Anzahl der Schritte im Histogramm.The number of step in the histogram.
range_high_keyrange_high_key sql_variantsql_variant Oberer Spaltengrenzwert für einen Histogrammschritt.Upper bound column value for a histogram step. Der Spaltenwert wird auch als Schlüsselwert bezeichnet.The column value is also called a key value.
RANGE_ROWSrange_rows realreal Geschätzte Anzahl von Zeilen, deren Spaltenwerte innerhalb eines Histogrammschritts liegen, ohne den oberen Grenzwert.Estimated number of rows whose column value falls within a histogram step, excluding the upper bound.
equal_rowsequal_rows realreal Geschätzte Anzahl von Zeilen, deren Spaltenwerte der Obergrenze des Histogrammschritts entsprechen.Estimated number of rows whose column value equals the upper bound of the histogram step.
DISTINCT_RANGE_ROWSdistinct_range_rows bigintbigint Geschätzte Anzahl von Zeilen mit einem unterschiedlichen Spaltenwert innerhalb eines Histogrammschritts ohne den oberen Grenzwert.Estimated number of rows with a distinct column value within a histogram step, excluding the upper bound.
average_range_rowsaverage_range_rows realreal Durchschnittliche Anzahl von Zeilen mit doppelten Spaltenwerten in einem Histogrammschritt, ohne den oberen Grenzwert (RANGE_ROWS / DISTINCT_RANGE_ROWS für DISTINCT_RANGE_ROWS > 0).Average number of rows with duplicate column values within a histogram step, excluding the upper bound (RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0).

HinweiseRemarks

Das Resultset für sys.dm_db_stats_histogram sieht etwa so DBCC SHOW_STATISTICS WITH HISTOGRAM sowie object_id, stats_id, und step_number.The resultset for sys.dm_db_stats_histogram returns information similar to DBCC SHOW_STATISTICS WITH HISTOGRAM and also includes object_id, stats_id, and step_number.

Da die Spalte range_high_key ist eine Sql_variant-Daten geben, müssen Sie möglicherweise verwenden CAST oder CONVERT ist ein Prädikat Vergleich mit einer Zeichenfolgenkonstante der Fall.Because the column range_high_key is a sql_variant data type, you may need to use CAST or CONVERT if a predicate does comparison with a non-string constant.

HistogrammHistogram

Ein Histogramm misst die Häufigkeit des Vorkommens für jeden unterschiedlichen Wert in einem Dataset.A histogram measures the frequency of occurrence for each distinct value in a data set. 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.The query optimizer computes a histogram on the column values in the first key column of the statistics object, selecting the column values by statistically sampling the rows or by performing a full scan of all rows in the table or view. 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.If the histogram is created from a sampled set of rows, the stored totals for number of rows and number of distinct values are estimates and do not need to be whole integers.

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.To create the histogram, the query optimizer sorts the column values, computes the number of values that match each distinct column value and then aggregates the column values into a maximum of 200 contiguous histogram steps. Jeder Schritt enthält einen Bereich von Spaltenwerten gefolgt von einem oberen Spaltengrenzwert.Each step includes a range of column values followed by an upper bound column value. Der Bereich enthält alle möglichen Spaltenwerte zwischen den Begrenzungswerten, ohne die Begrenzungswerte selbst.The range includes all possible column values between boundary values, excluding the boundary values themselves. Der niedrigste der sortierten Spaltenwerte ist der obere Grenzwert für den ersten Histogrammschritt.The lowest of the sorted column values is the upper boundary value for the first histogram step.

Das folgende Diagramm zeigt ein Histogramm mit sechs Schritten.The following diagram shows a histogram with six steps. Der Bereich links vom ersten oberen Grenzwert ist der erste Schritt.The area to the left of the first upper boundary value is the first step.

Für jeden Histogrammschritt gilt:For each histogram step:

  • Eine fett formatierte Zeile stellt den oberen Grenzwert (range_high_key) und die Häufigkeit des Vorkommens (equal_rows) dar.Bold line represents the upper boundary value (range_high_key) and the number of times it occurs (equal_rows)

  • 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.Solid area left of range_high_key represents the range of column values and the average number of times each column value occurs (average_range_rows). average_range_rows ist für den ersten Histogrammschritt immer 0.The average_range_rows for the first histogram step is always 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).Dotted lines represent the sampled values used to estimate total number of distinct values in the range (distinct_range_rows) and total number of values in the range (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.The query optimizer uses range_rows and distinct_range_rows to compute average_range_rows and does not store the sampled values.

Der Abfrageoptimierer definiert die Histogrammschritte gemäß ihrer statistischen Bedeutung.The query optimizer defines the histogram steps according to their statistical significance. 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.It uses a maximum difference algorithm to minimize the number of steps in the histogram while maximizing the difference between the boundary values. Die maximale Anzahl von Schritten ist 200.The maximum number of steps is 200. Die Anzahl von Histogrammschritten kann geringer sein als die Anzahl unterschiedlicher Werte, auch bei Spalten mit weniger als 200 Grenzpunkten.The number of histogram steps can be fewer than the number of distinct values, even for columns with fewer than 200 boundary points. Beispielsweise kann eine Spalte mit 100 unterschiedlichen Werten ein Histogramm mit weniger als 100 Grenzpunkten aufweisen.For example, a column with 100 distinct values can have a histogram with fewer than 100 boundary points.

BerechtigungenPermissions

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.Requires that the user has select permissions on statistics columns or the user owns the table or the user is a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

BeispieleExamples

A.A. Einfaches BeispielSimple example

Das folgende Beispiel erstellt und füllt eine einfache Tabelle.The following example creates and populates a simple table. Klicken Sie dann erstellt Statistiken für die Country_Name Spalte.Then creates statistics on the Country_Name column.

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äre Schlüssel belegt stat_id Zahl (1), weshalb sys.dm_db_stats_histogram für stat_id Nummer 2, um das statistikhistogramm für zurückzugeben der Country Tabelle.The primary key occupies stat_id number 1, so call sys.dm_db_stats_histogram for stat_id number 2, to return the statistics histogram for the Country table.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Country'), 2);

B.B. Praktische Abfrage:Useful query:

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.C. Praktische Abfrage:Useful query:

Das folgende Beispiel wählt aus Tabelle Country mit einem Prädikat für Spalte Country_Name.The following example selects from table Country with a predicate on column Country_Name.

SELECT * FROM Country 
WHERE Country_Name = 'Canada';

Im folgenden Beispiel wird die zuvor erstellte Statistik für Tabelle untersucht Country und Country_Name für den das Prädikat in der obigen Abfrage übereinstimmende Histogrammschritt.The following example looks at the previously created statistic on table Country and column Country_Name for the histogram step matching the predicate in the query above.

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));

Siehe auchSee Also

DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
Objektbezogene dynamische Verwaltungssichten und-Funktionen (Transact-SQL)Object Related Dynamic Management Views and Functions (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL)sys.dm_db_stats_properties (Transact-SQL)