Condividi tramite


Statistiche per le tabelle Memory-Optimized

Query Optimizer usa statistiche sulle colonne per creare piani di query che migliorano le prestazioni delle query. Le statistiche vengono raccolte dalle tabelle nel database e archiviate nei metadati del database.

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

I dati delle tabelle cambiano in genere nel tempo man mano che le righe vengono inserite, aggiornate ed eliminate. Ciò significa che le statistiche devono essere aggiornate periodicamente. Per impostazione predefinita, le statistiche sulle tabelle basate su disco vengono aggiornate automaticamente quando l'ottimizzatore determina che potrebbero non essere aggiornate.

Le statistiche sulle tabelle ottimizzate per la memoria non vengono aggiornate per impostazione predefinita. È invece necessario aggiornarli 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 interne e utente 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 dopo l'ultimo 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 conoscere le tabelle con modifiche significative in modo da poter aggiornare le statistiche singolarmente.

Le statistiche possono essere generate tramite il campionamento dei dati o l'esecuzione di un'analisi completa. Le statistiche campionate usano solo un campione di dati della tabella per stimare la distribuzione dei dati. Le statistiche fullscan analizzano l'intera tabella per determinare la distribuzione dei dati. Le statistiche fullscan sono in genere più accurate, ma richiedono più tempo per calcolare. Le statistiche campionate possono essere raccolte più velocemente.

Per impostazione predefinita, le tabelle basate su disco usano statistiche campionate. Le tabelle ottimizzate per la memoria supportano solo le 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 sulle tabelle ottimizzate per la memoria:

  • Gli indici nelle tabelle ottimizzate per la memoria vengono creati insieme alla tabella. Le statistiche sulle colonne chiave di indice vengono create quando la tabella è vuota. Pertanto, queste statistiche devono essere aggiornate dopo il caricamento dei dati nella tabella.

  • I piani di esecuzione delle query nelle stored procedure compilate nativamente sono ottimizzati durante la compilazione della procedura. Ciò si verifica solo quando viene creata la routine e quando il server viene riavviato, non quando vengono aggiornate le statistiche. Pertanto, le tabelle devono contenere un set rappresentativo di dati e statistiche devono essere up-to-date prima della creazione delle procedure. Le stored procedure compilate in modo nativo vengono ricompilate se il database viene portato offline e riportato online o se è presente un riavvio del server.

Linee guida per le statistiche durante la distribuzione di tabelle Memory-Optimized

Per assicurarsi che Query Optimizer disponga di statistiche up-to-date durante la creazione di piani di query, distribuire tabelle ottimizzate per la memoria usando questi cinque passaggi:

  1. Creare tabelle e indici. Gli indici vengono specificati in line nelle CREATE TABLE dichiarazioni.

  2. Caricare i dati nelle tabelle.

  3. Aggiornare le statistiche sulle tabelle.

  4. Creare le stored procedure che accedono alle tabelle.

  5. Esegui il carico di lavoro, che può contenere una combinazione di stored procedure Transact-SQL nativamente compilate e interpretate, oltre a batch ad hoc.

La creazione di stored procedure compilate in modo nativo dopo il caricamento dei dati e l'aggiornamento delle statistiche garantisce che l'ottimizzatore disponga di statistiche disponibili per le tabelle ottimizzate per la memoria. Ciò garantisce piani di query efficienti quando la procedura viene compilata.

Linee guida per la gestione delle statistiche sulle tabelle Memory-Optimized

Per mantenere le statistiche up-to-date, aggiornare regolarmente le statistiche sulle tabelle ottimizzate per la memoria.

Se i dati cambiano frequentemente, è consigliabile aggiornare frequentemente le statistiche. Ad esempio, aggiornare le statistiche della tabella dopo un aggiornamento batch. Dopo aver aggiornato le statistiche, eliminare e ricreare le stored procedure nativamente compilate in modo che possano trarre vantaggio dalle statistiche aggiornate.

.

Non aggiornare le statistiche durante il picco del 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 nel database, eseguire sp_updatestats (Transact-SQL).

L'esempio seguente segnala l'ultimo aggiornamento delle statistiche sulle tabelle ottimizzate per la memoria. Queste informazioni consentono di decidere 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