Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för: SQL Server 2016 (13.x) och senare versioner
Azure SQL Database
Azure SQL Managed Instance
Returnerar statistik histogrammet för det angivna databasobjektet (tabell eller indexerad vy) i den aktuella SQL Server-databasen. Liknande DBCC SHOW_STATISTICS WITH HISTOGRAM.
Anmärkning
Denna DMF är tillgänglig från och med SQL Server 2016 (13.x) SP1 CU2
Syntax
sys.dm_db_stats_histogram (object_id , stats_id)
Arguments
object_id
ID:t för objektet i den aktuella databasen som egenskaperna för en av dess statistik begärs för. object_id är int.
stats_id
ID för statistik för den angivna object_id. Statistik-ID:t kan hämtas från den dynamiska hanteringsvyn sys.stats . stats_id är int.
Tabellen returnerades
| Kolumnnamn | Datatyp | Description |
|---|---|---|
object_id |
int | ID för objektet (tabell eller indexerad vy) för vilket egenskaperna för statistikobjektet ska returneras. |
stats_id |
int | ID för statistikobjektet. Är unikt i tabellen eller i indexvyn. Mer information finns i sys.stats. |
step_number |
int | Antalet steg i histogrammet. |
range_high_key |
sql_variant | Kolumnvärde med övre gräns för ett histogramsteg. Kolumnvärdet kallas även för ett nyckelvärde. |
range_rows |
verklig | Uppskattat antal rader vars kolumnvärde faller inom ett histogramsteg, exklusive den övre gränsen. |
equal_rows |
verklig | Uppskattat antal rader vars kolumnvärde är lika med histogramstegets övre gräns. |
distinct_range_rows |
bigint | Uppskattat antal rader med ett distinkt kolumnvärde i ett histogramsteg, exklusive den övre gränsen. |
average_range_rows |
verklig | Genomsnittligt antal rader med duplicerade kolumnvärden i ett histogramsteg, exklusive den övre gränsen (RANGE_ROWS / DISTINCT_RANGE_ROWS för DISTINCT_RANGE_ROWS > 0). |
Anmärkningar
Resultatuppsättningen för sys.dm_db_stats_histogram returnerar information som liknar DBCC SHOW_STATISTICS WITH HISTOGRAM och innehåller object_idäven , stats_idoch step_number.
Eftersom kolumnen range_high_key är en sql_variant datatyp kan du behöva använda CAST eller CONVERT om ett predikat jämförs med en icke-strängkonstant.
Histogram
Ett histogram mäter förekomstens frekvens för varje distinkt värde i en datauppsättning. Frågeoptimeraren beräknar ett histogram på kolumnvärdena i den första nyckelkolumnen i statistikobjektet, väljer kolumnvärdena genom att statistiskt sampela raderna eller genom att utföra en fullständig genomsökning av alla rader i tabellen eller vyn. Om histogrammet skapas från en samplad uppsättning rader är de lagrade summorna för antalet rader och antalet distinkta värden uppskattningar och behöver inte vara heltal.
För att skapa histogrammet sorterar frågeoptimeraren kolumnvärdena, beräknar antalet värden som matchar varje distinkt kolumnvärde och aggregerar sedan kolumnvärdena i högst 200 sammanhängande histogramsteg. Varje steg innehåller ett intervall med kolumnvärden följt av ett kolumnvärde med övre gräns. Intervallet innehåller alla möjliga kolumnvärden mellan gränsvärdena, exklusive själva gränsvärdena. Det lägsta av de sorterade kolumnvärdena är det övre gränsvärdet för det första histogramsteget.
Följande diagram visar ett histogram med sex steg. Området till vänster om det första övre gränsvärdet är det första steget.
För varje histogramsteg:
Fet linje representerar det övre gränsvärdet (range_high_key) och antalet gånger det inträffar (equal_rows)
Heldragen yta till vänster om range_high_key representerar kolumnvärdenas intervall och det genomsnittliga antalet gånger varje kolumnvärde inträffar (average_range_rows). Det average_range_rows för det första histogramsteget är alltid 0.
Streckade linjer representerar de sampelvärden som används för att uppskatta det totala antalet distinkta värden i intervallet (distinct_range_rows) och det totala antalet värden i intervallet (range_rows). Frågeoptimeraren använder range_rows och distinct_range_rows för att beräkna average_range_rows och lagrar inte de samplade värdena.
Frågeoptimeraren definierar histogramstegen enligt deras statistiska signifikans. Den använder en algoritm för maximal skillnad för att minimera antalet steg i histogrammet samtidigt som skillnaden mellan gränsvärdena maximeras. Det maximala antalet steg är 200. Antalet histogramsteg kan vara färre än antalet distinkta värden, även för kolumner med färre än 200 gränspunkter. En kolumn med 100 distinkta värden kan till exempel ha ett histogram med färre än 100 gränspunkter.
Permissions
Kräver att användaren har valt behörigheter för statistikkolumner eller att användaren äger tabellen eller att användaren är medlem i den fasta serverrollen sysadmin , db_owner fast databasroll eller db_ddladmin fast databasroll.
Examples
A. Grundläggande exempel
I följande exempel skapas och fylls en grundläggande tabell i. Skapar sedan statistik i Region_Name kolumnen.
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);
Primärnyckeln upptar stat_id nummer 1, så anropa sys.dm_db_stats_histogram nummer 2 för stat_id att returnera statistik histogrammet för Region tabellen.
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 2);
B. Användbar fråga
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. Användbar fråga
I följande exempel väljs från tabellen Region med ett predikat för kolumnen Region_Name.
SELECT * FROM Region
WHERE Region_Name = 'Canada';
I följande exempel tittar vi på den tidigare skapade statistiken i tabellen Region och kolumnen Region_Name för histogramsteget som matchar predikatet i frågan ovan.
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));