Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: SQL Server 2016 (13.x) e versioni
successive Azure SQL Database
AzureSQL Managed Instance
SQL database in Microsoft Fabric
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 cui vengono richieste le proprietà di una delle relative statistiche. object_id è di tipo int.
stats_id
ID delle statistiche per il object_id specificato. 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. |
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 di righe campionato, i totali archiviati per il numero di righe e il numero di valori distinti sono stime e non devono essere 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
È necessario che l'utente disponga delle autorizzazioni di selezione per le colonne statistiche o che l'utente sia proprietario della tabella o che l'utente sia 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 di base
Nell'esempio seguente viene creata e popolata una tabella di base. Poi crea statistiche sulla colonna 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);
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 Region.
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 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 Region con un predicato nella colonna Region_Name.
SELECT * FROM Region
WHERE Region_Name = 'Canada';
Nell'esempio seguente viene esaminata la statistica creata in precedenza nella tabella Region e nella colonna Region_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 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));