sys.dm_db_stats_histogram (Transact-SQL)
Si applica a: SQL Server 2016 (13.x) e versioni successive Database SQL di Azure Istanza 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.
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)