Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na: SQL Server 2016 (13.x) a novější verze
Azure SQL Database
Azure SQL Managed Instance
SQL database in Microsoft Fabric
Vrátí histogram statistiky pro zadaný databázový objekt (tabulkové nebo indexované zobrazení) v aktuální databázi SQL Serveru. Podobá se DBCC SHOW_STATISTICS WITH HISTOGRAM.
Poznámka:
Toto DMF je k dispozici od SQL Serveru 2016 (13.x) SP1 CU2.
Syntaxe
sys.dm_db_stats_histogram (object_id , stats_id)
Arguments
object_id
ID objektu v aktuální databázi, pro které jsou požadovány vlastnosti jedné z jeho statistik. object_id je int.
stats_id
ID statistiky pro zadanou object_id. ID statistiky lze získat ze zobrazení dynamické správy sys.stats . stats_id je int.
Vrácená tabulka
| Název sloupce | Datový typ | Description |
|---|---|---|
object_id |
int | ID objektu (tabulky nebo indexovaného zobrazení), pro který se mají vrátit vlastnosti objektu statistiky. |
stats_id |
int | ID objektu statistiky. Je jedinečný v rámci tabulky nebo indexovaného zobrazení. Další informace naleznete v tématu sys.stats. |
step_number |
int | Počet kroků v histogramu |
range_high_key |
sql_variant | Hodnota horního vázaného sloupce pro krok histogramu Hodnota sloupce se také nazývá hodnota klíče. |
range_rows |
reálný | Odhadovaný počet řádků, jejichž hodnota sloupce spadá do kroku histogramu s výjimkou horní hranice |
equal_rows |
reálný | Odhadovaný počet řádků, jejichž hodnota sloupce se rovná horní hranici kroku histogramu. |
distinct_range_rows |
bigint | Odhadovaný počet řádků s jedinečnou hodnotou sloupce v kroku histogramu s výjimkou horní hranice |
average_range_rows |
reálný | Průměrný počet řádků s duplicitními hodnotami sloupců v kroku histogramu s výjimkou horní hranice (RANGE_ROWS / DISTINCT_RANGE_ROWS pro DISTINCT_RANGE_ROWS > 0). |
Poznámky
Sada výsledků pro sys.dm_db_stats_histogram návratové informace podobné DBCC SHOW_STATISTICS WITH HISTOGRAM a také obsahuje object_id, stats_ida step_number.
Vzhledem k tomu, že sloupec range_high_key je datový typ sql_variant, může být nutné použít CAST nebo CONVERT pokud predikát provádí porovnání s neřetězcovou konstantou.
Histogram
Histogram měří četnost výskytů pro každou jedinečnou hodnotu v sadě dat. Optimalizátor dotazů vypočítá histogram hodnot sloupců v prvním klíčovém sloupci objektu statistiky a vybere hodnoty sloupců statisticky vzorkováním řádků nebo provedením úplné kontroly všech řádků v tabulce nebo zobrazení. Pokud se histogram vytvoří ze vzorek sady řádků, uložené součty pro počet řádků a počet jedinečných hodnot jsou odhady a nemusí být celá celá čísla.
Pokud chcete vytvořit histogram, optimalizátor dotazu seřadí hodnoty sloupců, vypočítá počet hodnot, které odpovídají každé jedinečné hodnotě sloupce, a potom agreguje hodnoty sloupců do maximálně 200 souvislých kroků histogramu. Každý krok obsahuje rozsah hodnot sloupců následovaných hodnotou horního vázaného sloupce. Oblast zahrnuje všechny možné hodnoty sloupců mezi hodnotami hranic, s výjimkou samotných hodnot hranic. Nejnižší z hodnot seřazených sloupců je horní hraniční hodnota prvního kroku histogramu.
Následující diagram znázorňuje histogram se šesti kroky. Oblast vlevo od první hodnoty horní hranice je prvním krokem.
Pro každý krok histogramu:
Tučná čára představuje hodnotu horní hranice (range_high_key) a počet výskytů (equal_rows)
Plná oblast vlevo od range_high_key představuje rozsah hodnot sloupců a průměrný počet výskytů každé hodnoty sloupce (average_range_rows). Average_range_rows prvního kroku histogramu je vždy 0.
Tečkované čáry představují hodnoty vzorku použité k odhadu celkového počtu jedinečných hodnot v oblasti (distinct_range_rows) a celkového počtu hodnot v oblasti (range_rows). Optimalizátor dotazů používá range_rows a distinct_range_rows k výpočtu average_range_rows a neukládá vzorkované hodnoty.
Optimalizátor dotazů definuje kroky histogramu podle jejich statistického významu. Používá algoritmus maximálního rozdílu k minimalizaci počtu kroků v histogramu při maximalizaci rozdílu mezi hodnotami hranic. Maximální počet kroků je 200. Počet kroků histogramu může být menší než počet jedinečných hodnot, a to i u sloupců s méně než 200 hraničními body. Například sloupec s 100 jedinečnými hodnotami může mít histogram s méně než 100 hraničními body.
Povolení
Vyžaduje, aby uživatel vybral oprávnění pro sloupce statistik nebo uživatel vlastní tabulku nebo uživatel je členem pevné role serveru správce systému , db_owner pevné databázové role nebo db_ddladmin pevné databázové role.
Examples
A. Základní příklad
Následující příklad vytvoří a naplní základní tabulku. Potom vytvoří statistiku sloupce Region_Name .
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ární klíč zabírá stat_id číslo 1, takže volání sys.dm_db_stats_histogram čísla stat_id 2 vrátí histogram statistiky Region pro tabulku.
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 2);
B. Užitečný dotaz
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. Užitečný dotaz
Následující příklad vybere z tabulky Region s predikátem ve sloupci Region_Name.
SELECT * FROM Region
WHERE Region_Name = 'Canada';
Následující příklad se podívá na dříve vytvořenou statistiku v tabulce Region a sloupci Region_Name pro krok histogramu odpovídající predikátu v dotazu výše.
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));