Condividi tramite


sys.dm_db_stats_histogram (Transact-SQL)

Si applica a: SQL Server 2016 (13.x) e versioni successive Azure SQL Database AzureSQL Managed InstanceSQL 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.

Diagramma della modalità di calcolo di un istogramma dai valori di colonna campionati.

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