Udostępnij za pomocą


sys.dm_db_stats_histogram (Transact-SQL)

Dotyczy do: SQL Server 2016 (13.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Zwraca histogram statystyk dla określonego obiektu bazy danych (tabeli lub widoku indeksowanego) w bieżącej bazie danych programu SQL Server. Podobnie jak DBCC SHOW_STATISTICS WITH HISTOGRAM.

Uwaga / Notatka

Ten DMF jest dostępny od programu SQL Server 2016 (13.x) SP1 CU2

Składnia

sys.dm_db_stats_histogram (object_id , stats_id)

Arguments

object_id

Identyfikator obiektu w bieżącej bazie danych, dla którego żądane są właściwości jednej z jego statystyk. object_id jest int.

stats_id

Identyfikator statystyk dla określonego object_id. Identyfikator statystyk można uzyskać z dynamicznego widoku zarządzania sys.stats . stats_id jest int.

Zwrócona tabela

Nazwa kolumny Typ danych Description
object_id int Identyfikator obiektu (tabeli lub widoku indeksowanego), dla którego mają być zwracane właściwości obiektu statystyk.
stats_id int Identyfikator obiektu statystyk. Jest unikatowy w widoku tabeli lub indeksowanym. Aby uzyskać więcej informacji, zobacz sys.stats.
step_number int Liczba kroków w histogramie.
range_high_key sql_variant Górna wartość kolumny powiązanej dla kroku histogramu. Wartość kolumny jest również nazywana wartością klucza.
range_rows prawdziwy Szacowana liczba wierszy, których wartość kolumny mieści się w kroku histogramu, z wyłączeniem górnej granicy.
equal_rows prawdziwy Szacowana liczba wierszy, których wartość kolumny jest równa górnej granicy kroku histogramu.
distinct_range_rows bigint Szacowana liczba wierszy z unikatową wartością kolumny w kroku histogramu, z wyłączeniem górnej granicy.
average_range_rows prawdziwy Średnia liczba wierszy z zduplikowanymi wartościami kolumn w kroku histogramu, z wyłączeniem górnej granicy (RANGE_ROWS / DISTINCT_RANGE_ROWS dla DISTINCT_RANGE_ROWS > 0).

Uwagi

Zestaw wyników zwraca sys.dm_db_stats_histogram informacje podobne do DBCC SHOW_STATISTICS WITH HISTOGRAM , a także , object_idstats_idi step_number.

Ponieważ kolumna range_high_key jest typem danych sql_variant, może być konieczne użycie CAST lub CONVERT jeśli predykat porównuje się z stałą inną niż ciąg.

Histogram

Histogram mierzy częstotliwość występowania dla każdej odrębnej wartości w zestawie danych. Optymalizator zapytań oblicza histogram na wartościach kolumn w pierwszej kolumnie klucza obiektu statystyk, wybierając wartości kolumn, statystycznie próbkując wiersze lub wykonując pełne skanowanie wszystkich wierszy w tabeli lub widoku. Jeśli histogram jest tworzony na podstawie próbkowanego zestawu wierszy, przechowywane sumy dla liczby wierszy i liczby unikatowych wartości są szacowane i nie muszą być liczbami całkowitymi.

Aby utworzyć histogram, optymalizator zapytań sortuje wartości kolumn, oblicza liczbę wartości, które pasują do każdej odrębnej wartości kolumny, a następnie agreguje wartości kolumn w maksymalnie 200 ciągłych kroków histogramu. Każdy krok zawiera zakres wartości kolumn, po którym następuje górna wartość kolumny powiązanej. Zakres zawiera wszystkie możliwe wartości kolumn między wartościami granic, z wyłączeniem samych wartości granic. Najniższa z posortowanych wartości kolumn to górna wartość granicy pierwszego kroku histogramu.

Na poniższym diagramie przedstawiono histogram z sześcioma krokami. Obszar po lewej stronie pierwszej górnej wartości granicy jest pierwszym krokiem.

Diagram przedstawiający sposób obliczania histogramu na podstawie przykładowych wartości kolumn.

Dla każdego kroku histogramu:

  • Linia pogrubiona reprezentuje górną wartość granicy (range_high_key) i liczbę wystąpień (equal_rows)

  • Lewy obszar stały range_high_key reprezentuje zakres wartości kolumn, a średnia liczba wystąpień każdej wartości kolumny (average_range_rows). Average_range_rows pierwszego kroku histogramu jest zawsze 0.

  • Wiersze kropkowane reprezentują próbkowane wartości używane do szacowania całkowitej liczby odrębnych wartości w zakresie (distinct_range_rows) i łącznej liczby wartości w zakresie (range_rows). Optymalizator zapytań używa range_rows i distinct_range_rows do obliczania average_range_rows i nie przechowuje przykładowych wartości.

Optymalizator zapytań definiuje kroki histogramu zgodnie z ich istotnością statystyczną. Używa maksymalnego algorytmu różnicy, aby zminimalizować liczbę kroków w histogramie, jednocześnie maksymalizując różnicę między wartościami granic. Maksymalna liczba kroków to 200. Liczba kroków histogramu może być mniejsza niż liczba unikatowych wartości, nawet w przypadku kolumn z mniej niż 200 punktami granic. Na przykład kolumna z 100 odrębnymi wartościami może zawierać histogram z mniej niż 100 punktami granic.

Permissions

Wymaga, aby użytkownik miał uprawnienia do wybierania kolumn statystyk lub użytkownik jest właścicielem tabeli lub użytkownik jest członkiem stałej roli serwera sysadmin , stałej roli bazy danych db_owner lub stałej roli bazy danych db_ddladmin stałej roli bazy danych.

Przykłady

A. Przykład podstawowy

Poniższy przykład tworzy i wypełnia podstawową tabelę. Następnie tworzy statystyki dla kolumny 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);

Klucz podstawowy zajmuje stat_id numer 1, dlatego wywołaj numer sys.dm_db_stats_histogramstat_id 2, aby zwrócić histogram statystyk dla Region tabeli.

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

B. Przydatne zapytanie

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. Przydatne zapytanie

Poniższy przykład wybiera z tabeli Region z predykatem w kolumnie Region_Name.

SELECT * FROM Region
WHERE Region_Name = 'Canada';

W poniższym przykładzie przedstawiono wcześniej utworzoną statystykę tabeli Region i kolumny Region_Name dla kroku histogramu pasującego do predykatu w powyższym zapytaniu.

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