sys.dm_db_stats_histogram (Transact-SQL)

Si applica a: SQL Server 2016 (13.x) e versioni successive Database SQL diIstanza gestita di SQL di Azure

Restituisce l'istogramma delle statistiche per l'oggetto database specificato (tabella o vista indicizzata) nel database di SQL Server corrente. Simile a DBCC SHOW_STATISTICS WITH HISTOGRAM.

Nota

Questo DMF è disponibile solo a partire da SQL Server 2016 (13.x) SP1 CU2.

Sintassi

sys.dm_db_stats_histogram (object_id, stats_id)  

Argomenti

object_id
ID dell'oggetto nel database corrente per il quale sono richieste le proprietà di una delle relative statistiche. object_id è di tipo int.

stats_id
ID delle statistiche per l'oggetto object_idspecificato. L'ID delle statistiche può essere ottenuto dalla DMV sys.stats . stats_id è di tipo int.

Tabella restituita

Nome colonna Tipo di dati Descrizione
object_id int ID dell'oggetto (tabella o vista indicizzata) per cui restituire le proprietà dell'oggetto statistiche.
stats_id int ID dell'oggetto statistiche. Univoco all'interno della tabella o della vista indicizzata. Per altre informazioni, vedere sys.stats (Transact-SQL).
step_number int Numero di passaggi nell'istogramma.
range_high_key sql_variant Valore di colonna pari al limite superiore per un intervallo dell'istogramma. Il valore di colonna viene denominato anche valore chiave.
range_rows real Numero stimato di righe il cui valore di colonna è compreso in un intervallo dell'istogramma, escluso il limite superiore.
equal_rows real Numero stimato di righe il cui valore di colonna è uguale al limite superiore dell'intervallo dell'istogramma.
distinct_range_rows bigint Numero stimato di righe con un valore distinct di colonna compreso in un intervallo dell'istogramma, escluso il limite superiore.
average_range_rows real Numero medio di righe con un valore di colonna duplicato compreso in un intervallo dell'istogramma, escluso il limite superiore (RANGE_ROWS / DISTINCT_RANGE_ROWS per DISTINCT_RANGE_ROWS > 0).

Osservazioni:

Il set di risultati per sys.dm_db_stats_histogram restituisce informazioni simili a DBCC SHOW_STATISTICS WITH HISTOGRAM e include anche object_id, stats_id e step_number.

Poiché la colonna range_high_key è un tipo di dati sql_variant, potrebbe essere necessario usare CAST o CONVERT se un predicato esegue un confronto con una costante non stringa.

Istogramma

Un istogramma misura la frequenza di occorrenza per ogni valore distinct in un set di dati. Query Optimizer calcola un istogramma nei valori di colonna nella prima colonna chiave dell'oggetto statistiche, selezionando i valori di colonna tramite il campionamento statistico delle righe o un'analisi completa di tutte le righe della tabella o della vista. Se l'istogramma viene creato da un set campionato di righe, i totali archiviati per numero di righe e numero di valori distinct sono stime e non è necessario che siano numeri interi.

Per creare l'istogramma, Query Optimizer ordina i valori di colonna, calcola il numero di valori che corrispondono a ogni valore distinct di colonna, quindi aggrega i valori di colonna in un massimo di 200 intervalli contigui dell'istogramma. Ogni intervallo comprende un insieme di valori di colonna seguiti da un valore di colonna pari al limite superiore. Nell'insieme sono inclusi tutti i possibili valori di colonna compresi tra i valori limite, esclusi questi ultimi. Il minore tra i valori di colonna ordinati costituisce il limite superiore per il primo intervallo dell'istogramma.

Nel diagramma seguente viene illustrato un istogramma con sei intervalli. L'area a sinistra del primo valore limite superiore è il primo intervallo.

Image of how a histogram is calculated from sampled column values.

Per ogni intervallo dell'istogramma:

  • La riga in grassetto rappresenta il valore limite superiore (range_high_key) e il relativo numero di occorrenze (equal_rows).

  • L'area a tinta unita a sinistra di range_high_key rappresenta l'intervallo dei valori di colonna e il numero medio di occorrenze di ogni valore (average_range_rows) di colonna. Il valore average_range_rows per il primo passaggio dell'istogramma è sempre 0.

  • Le linee punteggiate rappresentano i valori campionati usati per stimare il numero complessivo dei valori distinti nell'intervallo (distinct_range_rows) e il numero complessivo dei valori nell'intervallo (range_rows). Query Optimizer usa range_rows e distinct_range_rows per calcolare average_range_rows e non archivia i valori campionati.

Query Optimizer definisce gli intervalli dell'istogramma in base al relativo significato statistico e utilizza un algoritmo per il calcolo della differenza massima per ridurre al minimo il numero di intervalli nell'istogramma, aumentando contemporaneamente la differenza tra i valori limite. Il numero massimo di intervalli è 200. Il numero di intervalli dell'istogramma può essere minore del numero di valori distinct, anche per le colonne con un numero di punti limite inferiore a 200. A una colonna con 100 valori distinct, ad esempio, può essere associato un istogramma con un numero di punti limite inferiore a 100.

Autorizzazioni

L'utente deve avere autorizzazioni di selezione per le colonne delle statistiche o essere proprietario della tabella o membro del ruolo predefinito del server sysadmin, del ruolo predefinito del database db_owner o del ruolo predefinito del database db_ddladmin.

Esempi

R. Esempio semplice

Nell'esempio seguente viene creata e popolata una semplice tabella. Poi crea statistiche sulla colonna Country_Name.

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

La chiave primaria occupa stat_id numero 1, quindi chiama sys.dm_db_stats_histogram per stat_id numero 2, per restituire l'istogramma statistico per la tabella Country.

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

B. Query utile:

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. Query utile:

Nell'esempio seguente viene selezionata una tabella Country con un predicato nella colonna Country_Name.

SELECT * FROM Country 
WHERE Country_Name = 'Canada';

Nell'esempio seguente viene esaminata la statistica creata in precedenza nella tabella Country e nella colonna Country_Name per il passaggio dell’istogramma corrispondente al predicato nella query precedente.

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

Passaggi successivi

DBCC SHOW_STATISTICS (Transact-SQL)
Funzioni e viste a gestione dinamica relative agli oggetti (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL)