Condividi tramite


UPDATE STATISTICS (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Aggiorna le statistiche di ottimizzazione delle query in una tabella o in una vista indicizzata. Per impostazione predefinita, Query Optimizer aggiorna già le statistiche come necessario per migliorare il piano di query. In alcuni casi è possibile migliorare le prestazioni di esecuzione delle query usando UPDATE STATISTICS o la stored procedure sp_updatestats per aggiornare le statistiche più di frequente rispetto agli aggiornamenti predefiniti.

Sebbene consenta di garantire che le query vengano compilate con statistiche aggiornate, L'aggiornamento delle statistiche tramite qualsiasi processo può causare la ricompilazione automatica dei piani di query. Si consiglia di non aggiornare le statistiche troppo frequentemente, perché è necessario mantenere un equilibrio a livello di prestazioni tra la necessità di migliorare i piani di query e il tempo necessario per la ricompilazione delle query. Tale equilibrio dipende dall'applicazione in uso. Per le operazioni UPDATE STATISTICS, è possibile usare tempdb per ordinare il campione di righe usato per la compilazione di statistiche.

Nota

Per altre informazioni sulle statistiche in Microsoft Fabric, vedere Statistiche in Microsoft Fabric.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

-- Syntax for SQL Server and Azure SQL Database  
  
UPDATE STATISTICS table_or_indexed_view_name   
    [   
        {   
            { index_or_statistics__name }  
          | ( { index_or_statistics_name } [ ,...n ] )   
                }  
    ]   
    [    WITH   
        [  
            FULLSCAN   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | SAMPLE number { PERCENT | ROWS }   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | RESAMPLE   
              [ ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]  
            | <update_stats_stream_option> [ ,...n ]  
        ]   
        [ [ , ] [ ALL | COLUMNS | INDEX ]   
        [ [ , ] NORECOMPUTE ]   
        [ [ , ] INCREMENTAL = { ON | OFF } ] 
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
    ] ;  
  
<update_stats_stream_option> ::=  
    [ STATS_STREAM = stats_stream ]  
    [ ROWCOUNT = numeric_constant ]  
    [ PAGECOUNT = numeric_contant ]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse 
  
UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  
-- Syntax for Microsoft Fabric

UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
        }  
    ]  
[;]  

Nota

Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.

Argomenti

table_or_indexed_view_name

Nome della tabella o della vista indicizzata che contiene l'oggetto statistico.

index_or_statistics_name o statistics_name | index_name o statistics_name

Nome dell'indice per cui aggiornare le statistiche o nome delle statistiche da aggiornare. Se non viene specificato index_or_statistics_name o statistics_name , Query Optimizer aggiorna tutte le statistiche per la tabella o la vista indicizzata. Sono incluse le statistiche create tramite l'istruzione CREATE STATISTICS, le statistiche di colonna singola create quando l'opzione AUTO_CREATE_STATISTICS è ON e quelle create per gli indici.

Per altre informazioni sulle AUTO_CREATE_STATISTICS, vedere Opzioni ALTER DATABASE SET. Per visualizzare tutti gli indici per una tabella o una vista, è possibile usare sp_helpindex.

FULLSCAN

Consente di calcolare le statistiche analizzando tutte le righe nella tabella o nella vista indicizzata. FULLSCAN e SAMPLE 100 PERCENT generano gli stessi risultati. Non è possibile usare FULLSCAN con l'opzione SAMPLE.

SAMPLE number { PERCENT | ROWS }

Percentuale approssimativa o numero di righe presenti nella tabella o nella vista indicizzata utilizzate da Query Optimizer durante l'aggiornamento delle statistiche. Per PERCENT, number può essere compreso tra 0 e 100, mentre per ROWS number può essere compreso tra 0 e il numero totale di righe. La percentuale effettiva o il numero di righe campionate da Query Optimizer potrebbero non corrispondere alla percentuale o al numero specificato. Query Optimizer analizza ad esempio tutte le righe in una pagina di dati.

SAMPLE è utile per situazioni particolari, quando il piano di query basato sul campionamento predefinito non è ottimale. Nella maggior parte dei casi non è necessario specificare SAMPLE, perché Query Optimizer utilizza il campionamento e determina le dimensioni del campione statisticamente significative per impostazione predefinita, nel rispetto dei requisiti previsti per la creazione di piani di query di alta qualità.

Nota

In SQL Server 2016 (13.x) quando si usa il livello di compatibilità del database 130, il campionamento dei dati per la compilazione delle statistiche viene eseguito in parallelo per migliorare le prestazioni della raccolta di statistiche. Query Optimizer userà statistiche di esempio parallele ogni volta che le dimensioni di una tabella superano una determinata soglia. A partire da SQL Server 2017 (14.x), indipendentemente dal livello di compatibilità del database, il comportamento è stato modificato in usando un'analisi seriale per evitare potenziali problemi di prestazioni con attese LATCH eccessive. Il resto del piano di query durante l'aggiornamento delle statistiche manterrà l'esecuzione parallela, se qualificata.

Non è possibile usare SAMPLE se viene specificata l'opzione FULLSCAN. Se non si specifica né SAMPLE né FULLSCAN, Query Optimizer utilizza i dati campionati e calcola le dimensioni del campione per impostazione predefinita.

Si sconsiglia di specificare 0 PERCENT o 0 ROWS. Se si specifica 0 PERCENT o ROWS, l'oggetto statistiche verrà aggiornato, ma non conterrà i dati delle statistiche.

Per la maggior parte dei carichi di lavoro, non è necessaria un'analisi completa e il campionamento predefinito è adeguato. Tuttavia, alcuni carichi di lavoro sensibili a distribuzioni dei dati con ampie variazioni potrebbero richiedere una dimensione maggiore di esempio, o anche un'analisi completa. Anche se le stime possono diventare più accurate con un'analisi completa rispetto a un'analisi campionata, i piani complessi potrebbero non trarre notevoli vantaggi.

Per altre informazioni, vedere Componenti e concetti delle statistiche.

RESAMPLE

Aggiorna ogni statistica utilizzando la frequenza di campionamento più recente.

L'utilizzo di RESAMPLE può comportare un'analisi di tabella completa. Per le statistiche per gli indici viene ad esempio utilizzata un'analisi di tabella completa per la frequenza di campionamento. Se non si specifica nessuna delle opzioni di campionamento, ovvero SAMPLE, FULLSCAN o RESAMPLE, Query Optimizer campiona i dati e calcola le dimensioni del campione per impostazione predefinita.

In Warehouse in Microsoft Fabric, RESAMPLE non è supportato.

PERSIST_SAMPLE_PERCENT = { ON | OFF }

Si applica a: SQL Server 2016 (13.x) Service Pack 1 CU4, SQL Server 2017 (14.x) Service Pack 1 o SQL Server 2019 (15.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure

Se l'impostazione è ON, per gli aggiornamenti successivi in cui la percentuale di campionamento non è stata indicata esplicitamente, le statistiche mantengono la percentuale di campionamento specificata. Se l'impostazione è OFF, per gli aggiornamenti successivi in cui la percentuale di campionamento non è stata indicata esplicitamente, la percentuale di campionamento delle statistiche viene reimpostata sul valore predefinito. Il valore predefinito è OFF.

DBCC SHOW_STATISTICS e sys.dm_db_stats_properties espongono il valore di percentuale di campionamento persistente per la statistica selezionata.

Se viene eseguita AUTO_UPDATE_STATISTICS, usa la percentuale di campionamento persistente, qualora disponibile, o la percentuale di campionamento predefinito se non disponibile. Il comportamento di RESAMPLE non è interessato da questa opzione.

Se la tabella viene troncata, tutte le statistiche basate sull'heap troncato o sull'albero B (HoBT) verranno ripristinate usando la percentuale di campionamento predefinita.

Nota

In SQL Server, quando si ricompila un indice che in precedenza aveva aggiornato le statistiche con PERSIST_SAMPLE_PERCENT, la percentuale di campionamento persistente viene ripristinata per impostazione predefinita. A partire da SQL Server 2016 (13.x) SP2 CU17, SQL Server 2017 (14.x) CU26 e SQL Server 2019 (15.x) CU10, la percentuale di campionamento persistente viene mantenuta anche quando si ricompila un indice.

ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]

Si applica a: SQL Server 2014 (12.x) e versioni successive

Forza la ricompilazione delle statistiche a livello foglia relative alle partizioni specificate nella clausola ON PARTITIONS e quindi unite per compilare le statistiche globali. L'opzione WITH RESAMPLE è obbligatoria, in quanto non è possibile eseguire il merge di statistiche di partizioni compilate con frequenze di campionamento differenti.

ALL | COLUMNS | INDEX

Aggiornare tutte le statistiche esistenti, le statistiche create in una o più colonne o le statistiche create per gli indici. Se non si specifica nessuna delle opzioni, l'istruzione UPDATE STATISTICS aggiorna tutte le statistiche sulla tabella o sulla vista indicizzata.

NORECOMPUTE

Disabilitare l'opzione di aggiornamento automatico delle statistiche AUTO_UPDATE_STATISTICS per le statistiche specificate. Se viene specificata questa opzione, Query Optimizer completa l'aggiornamento di queste statistiche e disabilita gli aggiornamenti futuri.

Per riabilitare il comportamento dell'opzione AUTO_UPDATE_STATISTICS, eseguire di nuovo UPDATE STATISTICS senza l'opzione NORECOMPUTE o eseguire sp_autostats.

Avviso

L'utilizzo di questa opzione può produrre piani di query non ottimali. È consigliabile limitare l'utilizzo di questa opzione e riservarne l'applicazione a un amministratore del sistema qualificato.

Per altre informazioni sull'opzione AUTO_STATISTICS_UPDATE, vedere Opzioni ALTER DATABASE SET.

INCREMENTAL = { ON | OFF }

Si applica a: SQL Server 2014 (12.x) e versioni successive

Quando è impostata su ON, le statistiche vengono ricreate come statistiche per partizione. Quando è impostata su OFF, l'albero delle statistiche viene eliminato e SQL Server ricalcola le statistiche. Il valore predefinito è OFF.

Se le statistiche per partizione non sono supportate, viene generato un errore. Le statistiche incrementali non sono supportate per i tipi di statistiche seguenti:

  • Statistiche create con indici il cui partizionamento non è allineato con la tabella di base.
  • Statistiche create per i database secondari leggibili Always On.
  • Statistiche create per i database di sola lettura.
  • Statistiche create per gli indici filtrati.
  • Statistiche create per le viste.
  • Statistiche create per le tabelle interne.
  • Statistiche create con indici spaziali o indici XML.

MAXDOP = max_degree_of_parallelism

Si applica a: SQL Server, a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3.

Esegue l'override dell'opzione di configurazione max_degree_of_parallelism per la durata dell'operazione statistica. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism. Utilizzare MAXDOP per limitare il numero di processori utilizzati durante l'esecuzione di un piano parallelo. Il valore massimo è 64 processori.

max_degree_of_parallelism può essere:

1
Disattiva la generazione di piani paralleli.

>1 Consente di limitare al valore specificato, o a un valore più basso in base al carico di lavoro corrente del sistema, il numero massimo di processori usati in un'operazione parallela statistica.

0 (predefinito)
Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.

update_stats_stream_option

Identificato solo a scopo informativo. Non supportato. Non è garantita la compatibilità con le versioni future.

AUTO_DROP = { ON | OFF }

Si applica a: SQL Server 2022 (16.x) e versioni successive.

Attualmente, se le statistiche vengono create tramite uno strumento di terze parti in un database del cliente, tali oggetti statistiche possono bloccare o interferire con le modifiche dello schema eventualmente desiderate dal cliente.

(a partire da SQL Server 2022 (16.x)| Questa funzionalità consente la creazione di oggetti statistiche in una modalità in modo che una modifica dello schema non venga bloccata dalle statistiche, ma le statistiche verranno invece ignorate. In questo modo, le statistiche con eliminazione automatica si comportano come statistiche create automaticamente.

Nota

Il tentativo di definire o di annullare l'impostazione della proprietà Auto_Drop in statistiche create automaticamente può generare errori: le statistiche create automaticamente usano sempre l'eliminazione automatica. In alcuni backup, quando ripristinati, questa proprietà potrebbe rimanere impostata in modo non corretto fino al successivo aggiornamento dell'oggetto statistiche (manuale o automatico). Tuttavia, le statistiche con eliminazione automatica si comportano sempre come statistiche create automaticamente.

Osservazioni:

Quando aggiornare LE STATISTICHE

Per altre informazioni su quando usare UPDATE STATISTICS, vedere Quando aggiornare le statistiche.

Limiti

  • L'aggiornamento delle statistiche non è supportato per le tabelle esterne. Per aggiornare le statistiche in una tabella esterna, eliminare e ricreare le statistiche.
  • L'opzione MAXDOP non è compatibile con le opzioni STATS_STREAM, ROWCOUNT e PAGECOUNT.
  • L'opzione MAXDOP è limitata dall'impostazione MAX_DOP del gruppo di carico di lavoro di Resource Governor, se in uso.

Aggiornare tutte le statistiche con sp_updatestats

Per informazioni su come aggiornare le statistiche per tutte le tabelle interne e definite dall'utente nel database, vedere la stored procedure sp_updatestats. Ad esempio, il comando seguente chiama sp_updatestats per aggiornare tutte le statistiche per il database.

EXEC sp_updatestats;  

Gestione automatica dell'indice e delle statistiche

Sfruttare le soluzioni, ad esempio la deframmentazione dell'indice adattativo, per gestire automaticamente la deframmentazione dell'indice e gli aggiornamenti delle statistiche per uno o più database. Questa procedura sceglie automaticamente se ricompilare o riorganizzare un indice in base al relativo livello di frammentazione, tra gli altri parametri, e aggiornare le statistiche con una soglia lineare.

Determinazione dell'ultimo aggiornamento delle statistiche

Per determinare la data dell'ultimo aggiornamento delle statistiche, usare la funzione STATS_DATE .

PDW / Azure Synapse Analytics

La sintassi seguente non è supportata da Analytics Platform System (PDW) /Azure Synapse Analytics:

UPDATE STATISTICS t1 (a,b);   
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;  
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;  
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;  
UPDATE STATISTICS t1 (a) WITH stats_stream = 0x01;  

Autorizzazioni

È richiesta l'autorizzazione ALTER per la tabella o la vista.

Esempi

R. Aggiornamento di tutte le statistiche di una tabella

In questo esempio vengono aggiornate tutte le statistiche della tabella SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. Aggiornamento delle statistiche per un indice

In questo esempio vengono aggiornate le statistiche relative all'indice AK_SalesOrderDetail_rowguid della tabella SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;  
GO  

C. Aggiornamento delle statistiche tramite un campionamento al 50 percento

Nell'esempio seguente vengono create e quindi aggiornate le statistiche per le colonne Name e ProductNumber della tabella Product.

USE AdventureWorks2022;
GO  
CREATE STATISTICS Products
    ON Production.Product ([Name], ProductNumber)
    WITH SAMPLE 50 PERCENT
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product(Products)
    WITH SAMPLE 50 PERCENT;

D. Aggiornamento delle statistiche tramite le opzioni FULLSCAN e NORECOMPUTE

Nell'esempio seguente vengono aggiornate le statistiche Products della tabella Product, viene eseguita un'analisi completa di tutte le righe della tabella Product, quindi viene disattivato l'aggiornamento automatico delle statistiche di Products.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)

E. Aggiornamento delle statistiche di una tabella

In questo esempio vengono aggiornate le statistiche CustomerStats1 della tabella Customer.

UPDATE STATISTICS Customer (CustomerStats1);  

F. Aggiornare statistiche tramite un'analisi completa

L'esempio seguente aggiorna le statistiche CustomerStats1 in base all'analisi di tutte le righe della tabella Customer.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Aggiornamento di tutte le statistiche di una tabella

In questo esempio vengono aggiornate tutte le statistiche della tabella Customer.

UPDATE STATISTICS Customer;

H. Uso di CREATE STATISTICS con AUTO_DROP

Per usare le statistiche di rilascio automatico, è sufficiente aggiungere quanto segue alla clausola "WITH" delle statistiche create o aggiornate.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON