Sdílet prostřednictvím


sys.dm_db_stats_histogram (Transact-SQL)

Platí na: SQL Server 2016 (13.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL 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.

Diagram způsobu výpočtu histogramu z hodnot vzorek sloupce

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