Statistiche per tabelle con ottimizzazione per la memoriaStatistics for Memory-Optimized Tables

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In Query Optimizer vengono utilizzate le statistiche sulle colonne per creare piani di query che consentono di migliorare le prestazioni di esecuzione delle query.The query optimizer uses statistics about columns to create query plans that improve query performance. Le statistiche vengono raccolte dalle tabelle del database e archiviate nei metadati del database.Statistics are collected from the tables in the database and stored in the database metadata.

Le statistiche vengono create automaticamente, ma possono essere create anche manualmente.Statistics are created automatically, but can also be created manually. Ad esempio, le statistiche vengono create automaticamente per le colonne chiave dell'indice alla creazione dell'indice.For example, statistics are created automatically for index key columns when the index is created. Per altre informazioni sulla creazione di statistiche, vedere Statistiche.For more information about creating statistics see Statistics.

I dati della tabella in genere cambiano nel corso del tempo quando le righe vengono inserite, aggiornate ed eliminate.Table data typically changes over time as rows are inserted, updated, and deleted. Ciò significa che le statistiche devono essere periodicamente aggiornate.This means statistics need to be updated periodically. Per impostazione predefinita, le statistiche sulle tabelle vengono aggiornate automaticamente quando Query Optimizer determina che potrebbero non essere aggiornate.By default, statistics on tables are updated automatically when the query optimizer determines they might be out of date.

Considerazioni sulle statistiche delle tabelle con ottimizzazione per la memoria:Considerations for statistics on memory-optimized tables:

  • A partire da SQL Server 2016 e in Database SQL di AzureAzure SQL Database, è supportato l'aggiornamento automatico delle statistiche per le tabelle con ottimizzazione per la memoria, quando si usa un livello di compatibilità del database di almeno 130.Starting in SQL Server 2016 and in Database SQL di AzureAzure SQL Database, automatic update of statistics is supported for memory-optimized tables, when using database compatibility level of at least 130. Vedere Livello di compatibilità ALTER DATABASE (Transact-SQL).See ALTER DATABASE Compatibility Level (Transact-SQL). Se un database include tabelle create in precedenza con un livello di compatibilità inferiore, è necessario aggiornare manualmente le statistiche una volta, per consentirne l'aggiornamento automatico per il futuro.If a database has tables that were previously created using a lower compatibility level, the statistics need to be updated manually once, to enable automatic update of statistics going forward.

  • Per le stored procedure compilate in modo nativo, i piani di esecuzione delle query nella procedura vengono ottimizzati quando la procedura viene compilata, ovvero al momento della creazione.For natively compiled stored procedures, execution plans for queries in the procedure are optimized when the procedure is compiled, which happens at create time. Le procedure non vengono automaticamente ricompilate quando si aggiornano le statistiche.They are not automatically recompiled when statistics are updated. Pertanto, le tabelle devono contenere un set di dati rappresentativo prima della creazione delle procedure.Therefore, the tables should contain a representative set of data before the procedures are created.

  • Le stored procedure compilate in modo nativo possono essere ricompilate manualmente tramite sp_recompile (Transact-SQL)e vengono ricompilate automaticamente se il database viene portato offline e poi online, se si verifica un failover del database o se il server viene riavviato.Natively compiled stored procedures can be manually recompiled using sp_recompile (Transact-SQL), and they are automatically recompiled if the database is taken offline and brought back online, or if there is a database failover or server restart.

Abilitazione dell'aggiornamento automatico delle statistiche nelle tabelle esistentiEnabling Automatic Update of Statistics in Existing Tables

Quando le tabelle vengono create in un database con livello di compatibilità di almeno 130, si abilita l'aggiornamento automatico di tutte le statistiche su quella tabella e non è richiesta alcuna azione aggiuntiva.When tables are created in a database that has compatibility level of at least 130, automatic update of statistics is enabled for all statistics on that table, and no further action is needed.

Se un database include tabelle con ottimizzazione per la memoria create in una versione precedente di SQL ServerSQL Server o con livello di compatibilità inferiore a 130, è necessario aggiornare manualmente le statistiche una volta per consentirne l'aggiornamento automatico per il futuro.If a database has memory-optimized tables that were created in an earlier version of SQL ServerSQL Server or under a lower compatibility level than 130, the statistics need to be updated manually once to enable automatic update going forward.

Per abilitare l'aggiornamento automatico delle statistiche per le tabelle con ottimizzazione per la memoria create con un livello di compatibilità meno recente, seguire questa procedura:To enable automatic update of statistics for memory-optimized tables that were created under an older compatibility level, follow these steps:

  1. Aggiornare il livello di compatibilità del database: ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130Update the database compatibility level: ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130

  2. Aggiornare manualmente le statistiche per le tabelle con ottimizzazione per la memoria.Manually update the statistics of the memory-optimized tables. Di seguito è riportato un esempio di script per tale operazione.Below is a sample script that performs the same.

  3. Ricompilare manualmente le stored procedure compilate in modo nativo per trarre vantaggio dalle statistiche aggiornate.Manually recompile the natively compiled stored procedures to benefit from the updated statistics.

Script a singola occorrenza per le statistiche: per le tabelle con ottimizzazione per la memoria create con un livello di compatibilità inferiore, è possibile eseguire lo script Transact-SQL seguente una volta per aggiornare le statistiche delle tabelle con ottimizzazione per la memoria e abilitare l'aggiornamento automatico delle statistiche per il futuro (presupponendo che AUTO_UPDATE_STATISTICS sia abilitato per il database):One-time script for statistics: For memory-optimized tables that were created under a lower compability level, you can run the following Transact-SQL script one time to update the statistics of all memory-optimized tables, and enable automatic update of statistics from then onward (assuming AUTO_UPDATE_STATISTICS is enabled for the database):

-- Assuming AUTO_UPDATE_STATISTICS is already ON for your database:
-- ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS ON;

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130;
GO
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT
      @sql += N'UPDATE STATISTICS '
         + quotename(schema_name(t.schema_id))
         + N'.'
         + quotename(t.name)
         + ';' + CHAR(13) + CHAR(10)
   FROM sys.tables AS t
   WHERE t.is_memory_optimized = 1 AND 
        t.object_id IN (SELECT object_id FROM sys.stats WHERE no_recompute=1)
;
EXECUTE sp_executesql @sql;
GO
-- Each row appended to @sql looks roughly like:
-- UPDATE STATISTICS [dbo].[MyMemoryOptimizedTable];

Verificare che l'aggiornamento automatico sia abilitato: lo script seguente consente di verificare se l'aggiornamento automatico è abilitato per le statistiche sulle tabelle con ottimizzazione per la memoria.Verify auto-update is enabled: The following script verifies whether automatic update is enabled for statistics on memory-optimized tables. Dopo aver eseguito lo script precedente restituirà 1 nella colonna auto-update enabled per tutti gli oggetti statistiche.After running the previous script it will return 1 in the column auto-update enabled for all statistic objects.

SELECT 
    quotename(schema_name(o.schema_id)) + N'.' + quotename(o.name) AS [table],
    s.name AS [statistics object],
    1-s.no_recompute AS [auto-update enabled]
FROM sys.stats s JOIN sys.tables o ON s.object_id=o.object_id
WHERE o.is_memory_optimized=1

Linee guida per la distribuzione di tabelle e procedureGuidelines for Deploying Tables and Procedures

Per garantire che le statistiche in Query Optimizer risultino aggiornate durante la creazione dei piani di query, distribuire tabelle con ottimizzazione per la memoria e stored procedure compilate in modo nativo che accedono a tali tabelle usando i seguenti quattro passaggi:To ensure that the query optimizer has up-to-date statistics when creating query plans, deploy memory-optimized tables and natively compiled stored procedures that access these tables using these four steps:

  1. Verificare che il livello di compatibilità del database sia almeno 130.Ensure the database has compatibility level of at least 130. Vedere Livello di compatibilità ALTER DATABASE (Transact-SQL).See ALTER DATABASE Compatibility Level (Transact-SQL).

  2. Creare tabelle e indici.Create tables and indexes. Gli indici devono essere specificati inline nelle istruzioni CREATE TABLE .Indexes should be specified inline in the CREATE TABLE statements.

  3. Caricare i dati nelle tabelle.Load data into the tables.

  4. Creare stored procedure che accedono alle tabelle.Create stored procedures that access the tables.

    La creazione delle stored procedure compilate in modo nativo dopo il caricamento dei dati garantisce la presenza delle statistiche disponibili per le tabelle con ottimizzazione per la memoria in Query Optimizer.Creating natively compiled stored procedures after you load the data ensures that the optimizer has statistics available for the memory-optimized tables. In questo modo si ottengono piani di query efficienti quando la procedura viene compilata.This will ensure efficient query plans when the procedure is compiled.

Vedere ancheSee Also

Tabelle con ottimizzazione per la memoriaMemory-Optimized Tables