Creare e aggiornare le statistiche delle tabelle nel pool SQL dedicato
Questo articolo fornisce suggerimenti ed esempi per la creazione e l'aggiornamento delle statistiche di ottimizzazione delle query nelle tabelle nel pool SQL dedicato.
Perché usare le statistiche?
Più informazioni sui dati sono a disposizione del pool SQL dedicato, più rapidamente questo può eseguire le query. Dopo aver caricato i dati nel pool SQL dedicato, la raccolta di statistiche sui dati è una delle operazioni più importanti che è possibile eseguire per ottimizzare le query.
Query Optimizer del pool SQL dedicato è un ottimizzatore basato sui costi. Esegue un confronto fra i costi dei vari piani di query e poi sceglie quello che costa meno, che in molti casi è il piano eseguito più velocemente.
Ad esempio, Optimizer seleziona un determinato piano se stima che la data in cui la query filtra in restituisce una riga. Se l'utilità di ottimizzazione stima che la data selezionata restituisce un milione di righe, sceglie un piano diverso.
Creazione automatica di statistiche
Quando l'opzione del database AUTO_CREATE_STATISTICS
è attivata, il pool SQL dedicato analizza le query utente in ingresso per individuare le statistiche mancanti.
Se non sono presenti, Query Optimizer creerà statistiche su singole colonne nel predicato della query o nella condizione di join per migliorare le stime di cardinalità del piano di query.
Nota
Per impostazione predefinita, la creazione automatica di statistiche è attiva.
È possibile verificare se il pool SQL dedicato è AUTO_CREATE_STATISTICS
configurato eseguendo il comando T-SQL seguente:
SELECT name, is_auto_create_stats_on
FROM sys.databases
Se il pool SQL dedicato non è AUTO_CREATE_STATISTICS
configurato, è consigliabile abilitare questa proprietà eseguendo il comando seguente. Sostituire <your-datawarehouse-name>
con il nome del pool SQL dedicato.
ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON
Queste istruzioni attivano la creazione automatica delle statistiche:
SELECT
-
INSERT
...SELECT
-
CREATE TABLE AS SELECT
(CTAS) UPDATE
DELETE
-
EXPLAIN
quando viene rilevato un join o la presenza di un predicato
Nota
La creazione automatica delle statistiche non viene eseguita in tabelle temporanee o esterne.
La creazione automatica di statistiche viene generata in modo sincrono; se nelle colonne non sono presenti tutte le statistiche, quindi, è possibile che si verifichi un leggero peggioramento delle prestazioni delle query. Il tempo necessario per creare le statistiche relative a una colonna dipende dalle dimensioni della tabella.
Per evitare una riduzione delle prestazioni, verificare che le statistiche siano già state create eseguendo il carico di lavoro di benchmark prima della profilatura del sistema.
Nota
La creazione di statistiche viene registrata in sys.dm_pdw_exec_requests in un contesto utente diverso.
Quando vengono create statistiche automatiche, prendono il formato : _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>
. È possibile visualizzare le statistiche già create con il comando DBCC SHOW_STATISTICS:
DBCC SHOW_STATISTICS (<table_name>, <target>)
table_name
è il nome della tabella che contiene le statistiche da visualizzare. Questa tabella non può essere una tabella esterna. La destinazione è il nome dell'indice di destinazione, delle statistiche o della colonna per cui visualizzare le informazioni statistiche.
Aggiornare le statistiche
Una procedura consigliata consiste nell'aggiornare le statistiche sulle colonne data ogni giorno quando vengono aggiunte nuove date. Ogni volta che vengono caricate nuove righe nel pool SQL dedicato, vengono aggiunte nuove date di caricamento o date di transazione. Queste aggiunte modificano la distribuzione dei dati e rendono le statistiche obsolete.
Le statistiche su una colonna del paese o area in una tabella dei clienti possono non dover essere mai aggiornate, poiché la distribuzione dei valori in genere non cambia. Supponendo che la distribuzione sia costante tra i clienti, l'aggiunta di nuove righe alla variazione di tabella non modificherà la distribuzione dei dati.
Tuttavia se il pool SQL dedicato contiene solo un paese o area e si importano dati da un nuovo paese o area, archiviando in questo modo dati da più paesi o aree, sarà necessario aggiornare le statistiche sulla colonna del paese o area.
Di seguito sono fornite raccomandazioni per l'aggiornamento delle statistiche:
Attributo delle statistiche | Elemento consigliato |
---|---|
Frequenza degli aggiornamenti delle statistiche | Conservativa: giornaliera Dopo il caricamento o la trasformazione dei dati |
Campionamento | Se inferiore a 1 miliardo di righe, usare il campionamento predefinito (20%).
Se superiore a 1 miliardo righe, usare il campionamento del 2%. |
Una delle prime domande da porre quando si sta risolvendo la risoluzione dei problemi di una query è "Le statistiche sono aggiornate?"
Questa domanda non può essere risolta dall'età dei dati. Un oggetto statistiche aggiornato può essere vecchio se non sono state apportate modifiche sostanziali ai dati sottostanti. È necessario aggiornare le statistiche quando vengono apportate modifiche importanti al numero di righe o modifiche sostanziali alla distribuzione dei valori per una colonna specifica.
Non esiste alcuna vista a gestione dinamica per determinare se i dati all'interno della tabella sono stati modificati dopo l'ultimo aggiornamento delle statistiche. Le due query seguenti consentono di determinare se le statistiche non sono aggiornate.
Query 1: trovare la differenza tra il conteggio delle righe delle statistiche (
stats_row_count
) e il conteggio effettivo delle righe (actual_row_count
).select objIdsWithStats.[object_id], actualRowCounts.[schema], actualRowCounts.logical_table_name, statsRowCounts.stats_row_count, actualRowCounts.actual_row_count, row_count_difference = CASE WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count END, percent_deviation_from_actual = CASE WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100) ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100) END from ( select distinct object_id from sys.stats where stats_id > 1 ) objIdsWithStats left join ( select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id ) statsRowCounts on objIdsWithStats.object_id = statsRowCounts.object_id left join ( SELECT sm.name [schema] , tb.name logical_table_name , tb.object_id object_id , SUM(rg.row_count) actual_row_count FROM sys.schemas sm INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg ON rg.object_id = nt.object_id AND rg.pdw_node_id = nt.pdw_node_id AND rg.distribution_id = nt.distribution_id WHERE rg.index_id = 1 GROUP BY sm.name, tb.name, tb.object_id ) actualRowCounts on objIdsWithStats.object_id = actualRowCounts.object_id
Query 2: trovare l'età delle statistiche controllando l'ultima volta che le statistiche sono state aggiornate in ogni tabella.
Nota
Se si verifica una modifica sostanziale nella distribuzione dei valori per una colonna, è consigliabile aggiornare le statistiche indipendentemente dall'ultima volta in cui sono state aggiornate.
SELECT sm.[name] AS [schema_name], tb.[name] AS [table_name], co.[name] AS [stats_column_name], st.[name] AS [stats_name], STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date] FROM sys.objects ob JOIN sys.stats st ON ob.[object_id] = st.[object_id] JOIN sys.stats_columns sc ON st.[stats_id] = sc.[stats_id] AND st.[object_id] = sc.[object_id] JOIN sys.columns co ON sc.[column_id] = co.[column_id] AND sc.[object_id] = co.[object_id] JOIN sys.types ty ON co.[user_type_id] = ty.[user_type_id] JOIN sys.tables tb ON co.[object_id] = tb.[object_id] JOIN sys.schemas sm ON tb.[schema_id] = sm.[schema_id] WHERE st.[user_created] = 1;
Le colonne data in un pool SQL dedicato, ad esempio, richiedono solitamente aggiornamenti frequenti delle statistiche. Ogni volta che vengono caricate nuove righe nel pool SQL dedicato, vengono aggiunte nuove date di caricamento o date di transazione. Queste aggiunte modificano la distribuzione dei dati e rendono le statistiche obsolete.
Al contrario, è possibile che non sia mai necessario aggiornare le statistiche relative alla colonna del sesso in una tabella clienti. Supponendo che la distribuzione sia costante tra i clienti, l'aggiunta di nuove righe alla variazione di tabella non modificherà la distribuzione dei dati.
Se il pool SQL dedicato contiene solo un sesso e un nuovo requisito ha come risultato più sessi, allora sarà necessario aggiornare le statistiche relative alla colonna del sesso.
Per ulteriori informazioni, vedere indicazioni su Statistiche.
Implementare la gestione delle statistiche
Spesso è consigliabile estendere il processo di caricamento dei dati per assicurarsi che le statistiche vengano aggiornate alla fine del carico per evitare o ridurre al minimo il blocco o la contesa delle risorse tra query simultanee.
Il caricamento dei dati si verifica quando le tabelle modificano più frequentemente le dimensioni o la distribuzione dei valori. Il caricamento dei dati è una posizione logica per implementare alcuni processi di gestione.
Di seguito vengono illustrati i principi guida per l'aggiornamento delle statistiche:
- Assicurarsi che ogni tabella caricata includa almeno un oggetto statistiche aggiornato. Ciò permette di aggiornare le informazioni sulle dimensioni delle tabelle (numero di righe e pagine) come parte dell'aggiornamento delle statistiche.
- Concentrarsi sulle colonne incluse nelle clausole JOIN, GROUP BY, ORDER BY e DISTINCT.
- Prendere in considerazione l'aggiornamento di colonne chiave crescente, ad esempio le date delle transazioni con maggiore frequenza, perché questi valori non sono inclusi nell'istogramma delle statistiche.
- Prendere in considerazione una minore frequenza per l'aggiornamento delle colonne relative alla distribuzione statica.
- Occorre ricordare che ogni oggetto statistiche viene aggiornato in sequenza. La semplice implementazione di
UPDATE STATISTICS <TABLE_NAME>
non è sempre ottimale, in particolare per tabelle di grandi dimensioni con molti oggetti statistiche.
Per ulteriori informazioni, vedere Stima della cardinalità.
Esempi: Creare le statistiche
Questi esempi illustrano come usare diverse opzioni per la creazione delle statistiche. Le opzioni usate per ogni colonna dipendono dalle caratteristiche dei dati e dalla modalità di utilizzo della colonna nelle query.
Creare statistiche a colonna singola con opzioni predefinite
Per creare statistiche su una colonna, fornire un nome per l'oggetto statistiche e il nome della colonna.
Questa sintassi usa tutte le opzioni predefinite. Per impostazione predefinita, il 20% della tabella viene campionato durante la creazione di statistiche.
CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);
Ad esempio:
CREATE STATISTICS col1_stats ON dbo.table1 (col1);
Creare statistiche a colonna singola esaminando ogni riga
La frequenza di campionamento del 20% è sufficiente per la maggior parte delle situazioni. È tuttavia possibile modificare la frequenza di campionamento.
Per eseguire il campionamento dell'intera tabella, usare la sintassi seguente:
CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;
Ad esempio:
CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;
Creare statistiche a colonna singola specificando le dimensioni del campione
In alternativa, è possibile specificare le dimensioni del campione sotto forma di percentuale:
CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;
Creare statistiche a colonna singola solo su alcune righe
È anche possibile creare statistiche su una parte delle righe della tabella. Si tratta di una statistica filtrata.
Ad esempio, è possibile usare le statistiche filtrate quando si pianifica di eseguire una query in una partizione specifica di una tabella partizionata di grandi dimensioni. Creando statistiche solo sui valori di partizione, l'accuratezza delle statistiche migliora, migliorando così le prestazioni delle query.
Questo esempio crea statistiche su un intervallo di valori. È possibile definire con facilità i valori in modo che corrispondano all'intervallo di valori in una partizione.
CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';
Nota
Per fare in modo che Query Optimizer prenda in considerazione l'uso delle statistiche filtrate quando sceglie il piano di query distribuite, è necessario che la query rientri nella definizione dell'oggetto statistiche. Usando l'esempio precedente, la clausola WHERE della query deve specificare i valori col1 compresi tra 2000101 e 20001231.
Creare statistiche a colonna singola con tutte le opzioni
È anche possibile combinare le varie opzioni. L'esempio seguente crea un oggetto statistiche filtrato con una dimensione del campione personalizzata:
CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;
Per i riferimenti completi, vedere CREAZIONE DELLE STATISTICHE.
Creare statistiche a più colonne
Per creare un oggetto statistiche a più colonne, usare gli esempi precedenti, specificando però più colonne.
Nota
L'istogramma, che viene usato per stimare il numero di righe nei risultato della query, è disponibile solo per la prima colonna elencata nella definizione dell'oggetto statistiche.
In questo esempio l'istogramma è su product_category
. Le statistiche tra colonne vengono calcolate su product_category
e product_sub_category
:
CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;
Poiché esiste una correlazione tra product_category
e product_sub_category
, un oggetto statistiche a più colonne può essere utile se si accede contemporaneamente a queste colonne.
Creare statistiche su tutte le colonne in una tabella
Un modo per creare statistiche consiste nell'emettere CREATE STATISTICS
comandi dopo la creazione della tabella:
CREATE TABLE dbo.table1
(
col1 int
, col2 int
, col3 int
)
WITH
(
CLUSTERED COLUMNSTORE INDEX
)
;
CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);
Usare una stored procedure per creare statistiche su tutte le colonne in un pool SQL
Il pool SQL dedicato non ha una stored procedure di sistema equivalente a sp_create_stats
in SQL Server. Questa stored procedure crea un oggetto statistiche a colonna singola su ogni colonna in un pool SQL che non include già statistiche.
L'esempio seguente illustra come iniziare a usare la progettazione del pool SQL. È possibile adattare l'operazione alle proprie esigenze.
CREATE PROCEDURE [dbo].[prc_sqldw_create_stats]
( @create_type tinyint -- 1 default 2 Fullscan 3 Sample
, @sample_pct tinyint
)
AS
IF @create_type IS NULL
BEGIN
SET @create_type = 1;
END;
IF @create_type NOT IN (1,2,3)
BEGIN
THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;
IF @sample_pct IS NULL
BEGIN;
SET @sample_pct = 20;
END;
IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
DROP TABLE #stats_ddl;
END;
CREATE TABLE #stats_ddl
WITH ( DISTRIBUTION = HASH([seq_nmbr])
, LOCATION = USER_DB
)
AS
WITH T
AS
(
SELECT t.[name] AS [table_name]
, s.[name] AS [table_schema_name]
, c.[name] AS [column_name]
, c.[column_id] AS [column_id]
, t.[object_id] AS [object_id]
, ROW_NUMBER()
OVER(ORDER BY (SELECT NULL)) AS [seq_nmbr]
FROM sys.[tables] t
JOIN sys.[schemas] s ON t.[schema_id] = s.[schema_id]
JOIN sys.[columns] c ON t.[object_id] = c.[object_id]
LEFT JOIN sys.[stats_columns] l ON l.[object_id] = c.[object_id]
AND l.[column_id] = c.[column_id]
AND l.[stats_column_id] = 1
LEFT JOIN sys.[external_tables] e ON e.[object_id] = t.[object_id]
WHERE l.[object_id] IS NULL
AND e.[object_id] IS NULL -- not an external table
)
SELECT [table_schema_name]
, [table_name]
, [column_name]
, [column_id]
, [object_id]
, [seq_nmbr]
, CASE @create_type
WHEN 1
THEN CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
WHEN 2
THEN CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
WHEN 3
THEN CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
END AS create_stat_ddl
FROM T
;
DECLARE @i INT = 1
, @t INT = (SELECT COUNT(*) FROM #stats_ddl)
, @s NVARCHAR(4000) = N''
;
WHILE @i <= @t
BEGIN
SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);
PRINT @s
EXEC sp_executesql @s
SET @i+=1;
END
DROP TABLE #stats_ddl;
Per creare statistiche su tutte le colonne della tabella usando le impostazioni predefinite, chiamare la stored procedure.
EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;
Per creare statistiche su tutte le colonne della tabella eseguendo un'analisi completa, chiamare questa stored procedure.
EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;
Per creare statistiche campionate su tutte le colonne della tabella, immettere 3 e la percentuale di campione. Questa procedura usa una frequenza di campionamento del 20 %.
EXEC [dbo].[prc_sqldw_create_stats] 3, 20;
Esempi: aggiornare le statistiche
Per aggiornare le statistiche, è possibile eseguire le operazioni seguenti:
- Aggiornare un oggetto statistiche. Specificare il nome dell'oggetto statistiche che si desidera aggiornare.
- Aggiornare tutti gli oggetti statistiche in una tabella. Specificare il nome della tabella invece di un oggetto statistiche specifico.
Aggiornare un oggetto statistiche specifico
Usare la sintassi seguente per aggiornare un oggetto statistiche specifico:
UPDATE STATISTICS [schema_name].[table_name]([stat_name]);
Ad esempio:
UPDATE STATISTICS [dbo].[table1] ([stats_col1]);
L'aggiornamento di oggetti statistiche specifici permette di ridurre al minimo il tempo e le risorse necessari per gestire le statistiche. In questo modo è necessario scegliere con attenzione gli oggetti statistiche migliori da aggiornare.
Aggiornamento di tutte le statistiche di una tabella
Di seguito è illustrato un semplice metodo di aggiornamento di tutti gli oggetti statistiche in una tabella.
UPDATE STATISTICS [schema_name].[table_name];
Ad esempio:
UPDATE STATISTICS dbo.table1;
L'istruzione UPDATE STATISTICS
è facile da usare. Occorre ricordare che aggiorna tutte le statistiche nella tabella e che quindi potrebbe eseguire più lavoro del necessario. Se le prestazioni non sono un problema, questo è il modo più semplice e completo per garantire che le statistiche siano aggiornate.
Nota
Quando si aggiornano tutte le statistiche in una tabella, il pool SQL dedicato esegue un'analisi per campionare la tabella per ogni oggetto statistiche. Se si tratta di una tabella di grandi dimensioni, che include molte colonne e molte statistiche, potrebbe risultare più efficiente aggiornare le singole statistiche in base alle necessità.
Per l'implementazione della procedura UPDATE STATISTICS
, vedere Tabelle temporanee. Il metodo di implementazione è leggermente diverso rispetto alla procedura CREATE STATISTICS
precedente, ma il risultato è lo stesso.
Per la sintassi completa, vedere Aggiornamento delle statistiche.
Metadati delle statistiche
Esistono diverse visualizzazioni e funzioni di sistema che consentono di trovare informazioni sulle statistiche. Ad esempio, è possibile verificare se un oggetto statistiche non è aggiornato usando la funzione stats-date per vedere la data di creazione o dell'ultimo aggiornamento delle statistiche.
Viste del catalogo per le statistiche
Queste visualizzazioni di sistema forniscono informazioni sulle statistiche:
Vista del catalogo | Descrizione |
---|---|
sys.columns | Una riga per ogni colonna |
sys.objects | Una riga per ogni oggetto nel database |
sys.schemas | Una riga per ogni schema nel database |
sys.stats | Una riga per ogni oggetto statistiche |
sys.stats_columns | Una riga per ogni colonna nell'oggetto statistiche; collegamenti a sys.columns |
sys.tables | Una riga per ogni tabella (include tabelle esterne) |
sys.table_types | Una riga per ogni tipo di dati |
Funzioni di sistema per le statistiche
Queste funzioni di sistema sono utili per usare le statistiche:
Funzione di sistema | Descrizione |
---|---|
STATS_DATE | Data dell'ultimo aggiornamento dell'oggetto statistiche |
DBCC SHOW_STATISTICS | Livello di riepilogo e informazioni dettagliate sulla distribuzione dei valori come compreso dall'oggetto statistiche |
Combinare le colonne delle statistiche e le funzioni in un'unica visualizzazione
Questa vista riunisce le colonne correlate alle statistiche e ai risultati della STATS_DATE()
funzione.
CREATE VIEW dbo.vstats_columns
AS
SELECT
sm.[name] AS [schema_name]
, tb.[name] AS [table_name]
, st.[name] AS [stats_name]
, st.[filter_definition] AS [stats_filter_definition]
, st.[has_filter] AS [stats_is_filtered]
, STATS_DATE(st.[object_id],st.[stats_id])
AS [stats_last_updated_date]
, co.[name] AS [stats_column_name]
, ty.[name] AS [column_type]
, co.[max_length] AS [column_max_length]
, co.[precision] AS [column_precision]
, co.[scale] AS [column_scale]
, co.[is_nullable] AS [column_is_nullable]
, co.[collation_name] AS [column_collation_name]
, QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
AS two_part_name
, QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
AS three_part_name
FROM sys.objects AS ob
JOIN sys.stats AS st ON ob.[object_id] = st.[object_id]
JOIN sys.stats_columns AS sc ON st.[stats_id] = sc.[stats_id]
AND st.[object_id] = sc.[object_id]
JOIN sys.columns AS co ON sc.[column_id] = co.[column_id]
AND sc.[object_id] = co.[object_id]
JOIN sys.types AS ty ON co.[user_type_id] = ty.[user_type_id]
JOIN sys.tables AS tb ON co.[object_id] = tb.[object_id]
JOIN sys.schemas AS sm ON tb.[schema_id] = sm.[schema_id]
WHERE 1=1
AND st.[user_created] = 1
;
Esempi di DBCC SHOW_STATISTICS()
DBCC SHOW_STATISTICS()
mostra i dati contenuti all'interno di un oggetto statistiche. Questi dati sono costituiti da tre parti:
- Intestazione
- Vettore di densità
- Istogramma
Metadati di intestazione sulle statistiche. L'istogramma mostra la distribuzione dei valori nella prima colonna chiave dell'oggetto statistiche. Il vettore di densità misura la correlazione tra le colonne.
Nota
Il pool SQL dedicato calcola le stime di cardinalità con tutti i dati nell'oggetto statistiche.
Mostrare l'intestazione, la densità e l'istogramma
Questo semplice esempio mostra tutte e tre le parti di un oggetto statistiche:
DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)
Ad esempio:
DBCC SHOW_STATISTICS (dbo.table1, stats_col1);
Mostrare una o più parti di DBCC SHOW_STATISTICS()
Se si è interessati a visualizzare solo parti specifiche, usare la clausola WITH
e specificare le parti da visualizzare:
DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector
Ad esempio:
DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector
Differenze di DBCC SHOW_STATISTICS()
DBCC SHOW_STATISTICS()
viene implementato in modo più rigoroso nel pool SQL dedicato rispetto a SQL Server:
- Non sono supportate funzionalità non documentate.
- Non è possibile usare
Stats_stream
. - Non è possibile unire i risultati di specifici sottoinsiemi di dati statistici, Ad esempio:
STAT_HEADER JOIN DENSITY_VECTOR
. -
NO_INFOMSGS
non può essere impostato per l'eliminazione dei messaggi. - Non è possibile usare parentesi quadre per i nomi delle statistiche.
- Non è possibile usare i nomi di colonna per identificare gli oggetti statistiche.
- Non è supportato l'errore personalizzato 2767.
Contenuto correlato
Monitorare il carico di lavoro del pool SQL dedicato di Azure Synapse Analytics usando DMV