Condividi tramite


Statistiche per tabelle con ottimizzazione per la memoria

In Query Optimizer vengono utilizzate le statistiche sulle colonne per creare piani di query che consentono di migliorare le prestazioni di esecuzione delle query. Le statistiche vengono raccolte dalle tabelle del database e archiviate nei metadati del database.

Le statistiche vengono create automaticamente, ma possono essere create anche manualmente. Ad esempio, le statistiche vengono create automaticamente per le colonne chiave dell'indice alla creazione dell'indice. Per altre informazioni sulla creazione di statistiche, vedere Statistiche.

I dati della tabella in genere cambiano nel corso del tempo quando le righe vengono inserite, aggiornate ed eliminate. Ciò significa che le statistiche devono essere periodicamente aggiornate. Per impostazione predefinita, le statistiche sulle tabelle basate su disco vengono aggiornate automaticamente quando l'utilità di ottimizzazione determina che potrebbero non essere aggiornate.

Le statistiche sulle tabelle ottimizzate per la memoria non vengono aggiornate per impostazione predefinita. È necessario quindi aggiornarle manualmente. Usare UPDATE STATISTICS (Transact-SQL) per singole colonne, indici o tabelle. Usare sp_updatestats (Transact-SQL) per aggiornare le statistiche per tutte le tabelle utente e interne nel database.

Quando si usa CREATE STATISTICS (Transact-SQL) o UPDATE STATISTICS (Transact-SQL), è necessario specificare NORECOMPUTE per disabilitare l'aggiornamento automatico delle statistiche per le tabelle ottimizzate per la memoria. Per le tabelle basate su disco, sp_updatestats (Transact-SQL) aggiorna le statistiche solo se la tabella è stata modificata dall'ultima sp_updatestats (Transact-SQL). Per le tabelle ottimizzate per la memoria, sp_updatestats (Transact-SQL) genera sempre statistiche aggiornate. sp_updatestats (Transact-SQL) è un'opzione valida per le tabelle ottimizzate per la memoria; in caso contrario, è necessario sapere quali tabelle presentano modifiche significative in modo da poter aggiornare le statistiche singolarmente.

Le statistiche possono essere generate eseguendo il campionamento dei dati oppure un'analisi completa. Le statistiche campionate utilizzano solo un campione di dati della tabella per stimare la distribuzione dei dati. Le statistiche fullscan eseguono l'analisi dell'intera tabella per determinare la distribuzione dei dati. Le statistiche fullscan sono in genere più accurate, ma richiedono tempi di calcolo più lunghi. Le statistiche campionate possono essere raccolte più velocemente.

Le tabelle basate su disco utilizzano per impostazione predefinita le statistiche campionate. Le tabelle con ottimizzazione per la memoria supportano solo statistiche fullscan. Quando si usa CREATE STATISTICS (Transact-SQL) o UPDATE STATISTICS (Transact-SQL), è necessario specificare l'opzione per le tabelle ottimizzate per la FULLSCAN memoria.

Considerazioni aggiuntive per le statistiche delle tabelle ottimizzate per la memoria:

  • Gli indici delle tabelle ottimizzate per la memoria vengono creati con la tabella. Le statistiche delle colonne chiave dell'indice vengono create quando la tabella è vuota. Pertanto, queste statistiche devono essere aggiornate dopo che i dati vengono caricati nella tabella.

  • Per le stored procedure compilate in modo nativo, i piani di esecuzione delle query nella procedura vengono ottimizzati quando la procedura viene compilata. Questa operazione viene eseguita solo quando la procedura viene creata e il server viene riavviato, non quando le statistiche vengono aggiornate. Pertanto, le tabelle devono contenere un set rappresentativo di dati e le statistiche devono essere aggiornate prima che le procedure vengano create. Le stored procedure compilate in modo nativo vengono ricompilate se il database viene portato offline e poi online o se il server viene riavviato.

Linee guida per le statistiche durante la distribuzione delle tabelle con ottimizzazione per la memoria

Per garantire che le statistiche in Query Optimizer risultino aggiornate durante la creazione dei piani di query, distribuire le tabelle ottimizzate per la memoria utilizzando i seguenti cinque passaggi:

  1. Creare tabelle e indici. Gli indici sono specificati inline nelle istruzioni CREATE TABLE.

  2. Caricare i dati nelle tabelle.

  3. Aggiornare le statistiche delle tabelle.

  4. Creare stored procedure che accedono alle tabelle.

  5. Eseguire il carico di lavoro, che può contenere una combinazione di stored procedure Transact-SQL compilate e interpretate in modo nativo, nonché batch ad hoc.

La creazione delle stored procedure compilate in modo nativo dopo il caricamento dei dati e l'aggiornamento delle statistiche garantisce la presenza delle statistiche disponibili per le tabelle ottimizzate per la memoria in Query Optimizer. In questo modo si ottengono piani di query efficienti quando la procedura viene compilata.

Linee guida per la gestione delle statistiche delle tabelle con ottimizzazione per la memoria

Per mantenere le statistiche aggiornate, aggiornare regolarmente le statistiche delle tabelle ottimizzate per la memoria.

Se i dati vengono modificati di frequente, è necessario aggiornare spesso le statistiche. Ad esempio, aggiornare le statistiche delle tabelle dopo un aggiornamento batch. Dopo l'aggiornamento delle statistiche, eliminare e ricreare le stored procedure compilate in modo nativo perché possano utilizzare le statistiche aggiornate.

.

Non aggiornare le statistiche durante i picchi di carico di lavoro.

Per aggiornare le statistiche:

Per aggiornare le statistiche per una singola tabella ottimizzata per la memoria (myschema. Mytable), eseguire lo script seguente:

UPDATE STATISTICS myschema.Mytable WITH FULLSCAN, NORECOMPUTE  

Per aggiornare le statistiche per tutte le tabelle ottimizzate per la memoria nel database corrente, eseguire lo script seguente:

DECLARE @sql NVARCHAR(MAX) = N''  
  
SELECT @sql += N'  
   UPDATE STATISTICS ' + quotename(schema_name(schema_id)) + N'.' + quotename(name) + N' WITH FULLSCAN, NORECOMPUTE'  
FROM sys.tables WHERE is_memory_optimized=1  
  
EXEC sp_executesql @sql  

Per aggiornare le statistiche per tutte le tabelle del database, eseguire sp_updatestats (Transact-SQL).To update statistics for all tables in the database, run sp_updatestats (Transact-SQL).

Nell'esempio seguente viene indicato quando è stato effettuato l'ultimo aggiornamento delle statistiche sulle tabelle ottimizzate per la memoria. Queste informazioni sono utili per stabilire se è necessario aggiornare le statistiche.

select t.object_id, t.name, sp.last_updated as 'stats_last_updated'  
from sys.tables t join sys.stats s on t.object_id=s.object_id cross apply sys.dm_db_stats_properties(t.object_id, s.stats_id) sp  
where t.is_memory_optimized=1  

Vedere anche

Tabelle ottimizzate per la memoria