StatisticheStatistics

In Query Optimizer vengono utilizzate le statistiche per creare piani di query che consentono di migliorare le prestazioni di esecuzione delle query.The query optimizer uses statistics to create query plans that improve query performance. Per la maggior parte delle query, Query Optimizer genera già le statistiche necessarie per un piano di query di alta qualità. In alcuni casi, è necessario creare statistiche aggiuntive o modificare la progettazione delle query per ottenere risultati migliori.For most queries, the query optimizer already generates the necessary statistics for a high quality query plan; in a few cases, you need to create additional statistics or modify the query design for best results. In questo argomento vengono illustrati i concetti relativi alle statistiche e vengono fornite linee guida per un utilizzo efficace delle statistiche di ottimizzazione delle query.This topic discusses statistics concepts and provides guidelines for using query optimization statistics effectively.

Componenti e concetti Components and Concepts

StatisticheStatistics
Le statistiche di ottimizzazione delle query sono oggetti contenenti informazioni statistiche sulla distribuzione dei valori in una o più colonne di una tabella o di una vista indicizzata.Statistics for query optimization are objects that contain statistical information about the distribution of values in one or more columns of a table or indexed view. In Query Optimizer queste statistiche vengono usate per la stima della cardinalitào del numero di righe nel risultato della query.The query optimizer uses these statistics to estimate the cardinality, or number of rows, in the query result. Queste stime di cardinalità consentono a Query Optimizer di creare un piano di query di alta qualità.These cardinality estimates enable the query optimizer to create a high-quality query plan. Query Optimizer può ad esempio utilizzare le stime della cardinalità per scegliere l'operatore Index Seek anziché l'operatore Index Scan che utilizza un numero più elevato di risorse, migliorando di conseguenza le prestazioni di esecuzione delle query.For example, the query optimizer could use cardinality estimates to choose the index seek operator instead of the more resource-intensive index scan operator, and in doing so improve query performance.

Ogni oggetto statistiche viene creato in un elenco di una o più colonne di tabella e include un istogramma in cui è visualizzata la distribuzione dei valori nella prima colonna.Each statistics object is created on a list of one or more table columns and includes a histogram displaying the distribution of values in the first column. Negli oggetti statistiche su più colonne sono inoltre archiviate informazioni statistiche sulla correlazione dei valori tra le colonne.Statistics objects on multiple columns also store statistical information about the correlation of values among the columns. Queste statistiche sulla correlazione o densitàderivano dal numero di righe distinte di valori di colonna.These correlation statistics, or densities, are derived from the number of distinct rows of column values. Per altre informazioni sugli oggetti statistiche, vedere DBCC SHOW_STATISTICS (Transact-SQL).For more information about statistics objects, see DBCC SHOW_STATISTICS (Transact-SQL).

Statistiche filtrateFiltered Statistics
Le statistiche filtrate possono migliorare le prestazioni di esecuzione delle query che effettuano la selezione da subset ben definiti di dati.Filtered statistics can improve query performance for queries that select from well-defined subsets of data. Le statistiche filtrate utilizzano un predicato del filtro per selezionare il subset di dati incluso nelle statistiche.Filtered statistics use a filter predicate to select the subset of data that is included in the statistics. Statistiche filtrate progettate correttamente possono migliorare il piano di esecuzione delle query rispetto alle statistiche di tabella completa.Well-designed filtered statistics can improve the query execution plan compared with full-table statistics. Per altre informazioni sul predicato del filtro, vedere CREATE STATISTICS (Transact-SQL).For more information about the filter predicate, see CREATE STATISTICS (Transact-SQL). Per altre informazioni su quando creare statistiche filtrate, vedere la sezione Quando creare le statistiche in questo argomento.For more information about when to create filtered statistics, see the When to Create Statistics section in this topic. Per un case study, vedere l'intervento di blog sull' uso di statistiche filtrate con le tabelle partizionatesul sito Web SQLCAT.For a case study, see the blog entry, Using Filtered Statistics with Partitioned Tables, on the SQLCAT Web site.

Opzioni relative alle statisticheStatistics Options
Sono disponibili tre opzioni che se impostate influiscono sui tempi e sulle modalità di creazione e aggiornamento delle statistiche.There are three options that you can set that affect when and how statistics are created and updated. Queste opzioni vengono impostate solo a livello di database.These options are set at the database level only.

Opzione AUTO_CREATE_STATISTICSAUTO_CREATE_STATISTICS Option
Quando l'opzione per la creazione automatica delle statistiche, AUTO_CREATE_STATISTICS, è impostata su ON (attivata), Query Optimizer crea le statistiche necessarie per colonne singole nel predicato di query, al fine di migliorare le stime della cardinalità per il piano di query.When the automatic create statistics option, AUTO_CREATE_STATISTICS, is on, the query optimizer creates statistics on individual columns in the query predicate, as necessary, to improve cardinality estimates for the query plan. Queste statistiche di colonna singola vengono create in colonne che ancora non dispongono di un istogramma in un oggetto statistiche esistente.These single-column statistics are created on columns that do not already have a histogram in an existing statistics object. L'opzione AUTO_CREATE_STATISTICS non determina se le statistiche vengono create per gli indici.The AUTO_CREATE_STATISTICS option does not determine whether statistics get created for indexes. Questa opzione non genera inoltre statistiche filtrate,This option also does not generate filtered statistics. ma si applica esclusivamente alle statistiche di colonna singola per la tabella completa.It applies strictly to single-column statistics for the full table.

Quando Query Optimizer crea statistiche per colonne singole in seguito all'utilizzo dell'opzione AUTO_CREATE_STATISTICS, il nome delle statistiche inizia con _WA.When the query optimizer creates statistics as a result of using the AUTO_CREATE_STATISTICS option, the statistics name starts with _WA. Per determinare se tramite Query Optimizer vengono create statistiche per una colonna del predicato di query, è possibile utilizzare la query riportata di seguito.You can use the following query to determine if the query optimizer has created statistics for a query predicate column.

SELECT OBJECT_NAME(s.object_id) AS object_name,  
    COL_NAME(sc.object_id, sc.column_id) AS column_name,  
    s.name AS statistics_name  
FROM sys.stats AS s JOIN sys.stats_columns AS sc  
    ON s.stats_id = sc.stats_id AND s.object_id = sc.object_id  
WHERE s.name like '_WA%'  
ORDER BY s.name;  

Opzione AUTO_UPDATE_STATISTICSAUTO_UPDATE_STATISTICS Option
Quando l'opzione per l'aggiornamento automatico delle statistiche, AUTO_UPDATE_STATISTICS, è impostata su ON, Query Optimizer determina se le statistiche potrebbero non essere aggiornate, quindi ne esegue l'aggiornamento qualora vengano utilizzate tramite una query.When the automatic update statistics option, AUTO_UPDATE_STATISTICS, is on, the query optimizer determines when statistics might be out-of-date and then updates them when they are used by a query. Le statistiche diventano obsolete in seguito a operazioni di inserimento, aggiornamento, eliminazione o unione che modificano la distribuzione dei dati nella tabella o nella vista indicizzata.Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. Query Optimizer determina che le statistiche potrebbero non essere aggiornate contando il numero di modifiche apportate ai dati dopo l'ultimo aggiornamento delle statistiche e confrontando il numero di modifiche con una sogliaThe query optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. basata sul numero di righe nella tabella o nella vista indicizzata.The threshold is based on the number of rows in the table or indexed view.

  • SQL Server (2014 e versioni precedenti) usa una soglia basata sulla percentuale di righe modificate,SQL Server (2014 and earlier) uses a threshold based on the percent of rows changed. indipendente dal numero di righe nella tabella.This is regardless of the number of rows in the table.

  • SQL Server (a partire dalla versione 2016 e con livello di compatibilità 130) usa una soglia che si adatta al numero di righe nella tabella.SQL Server (starting with 2016 and under the compatibility level 130) uses a threshold that adjusts according to the number of rows in the table. Con questa modifica, le statistiche sulle tabelle di grandi dimensioni vengono aggiornate più spesso.With this change, statistics on large tables will be updated more often.

    Query Optimizer controlla la presenza di statistiche non aggiornate prima di compilare una query e prima di eseguire un piano di query memorizzato nella cache.The query optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Prima di compilare una query, Query Optimizer usano le colonne, le tabelle e le viste indicizzate nel predicato di query per identificare le eventuali statistiche non aggiornate.Before compiling a query, the query optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Prima di eseguire un piano di query memorizzato nella cache, il Motore di databaseDatabase Engine verifica che tale piano faccia riferimento alle statistiche aggiornate.Before executing a cached query plan, the Motore di databaseDatabase Engine verifies that the query plan references up-to-date statistics.

    L'opzione AUTO_UPDATE_STATISTICS si applica a oggetti statistiche creati per indici, colonne singole nei predicati di query e statistiche create con l'istruzione CREATE STATISTICS .The AUTO_UPDATE_STATISTICS option applies to statistics objects created for indexes, single-columns in query predicates, and statistics created with the CREATE STATISTICS statement. Questa opzione si applica anche alle statistiche filtrate.This option also applies to filtered statistics.

    AUTO_UPDATE_STATISTICS_ASYNCAUTO_UPDATE_STATISTICS_ASYNC
    L'opzione relativa all'aggiornamento asincrono delle statistiche, AUTO_UPDATE_STATISTICS_ASYNC, determina se Query Optimizer utilizza gli aggiornamenti sincroni o asincroni delle statistiche.The asynchronous statistics update option, AUTO_UPDATE_STATISTICS_ASYNC, determines whether the query optimizer uses synchronous or asynchronous statistics updates. L'opzione relativa all'aggiornamento asincrono delle statistiche è disattivata (OFF) per impostazione predefinita. Query Optimizer aggiorna pertanto le statistiche in modo sincrono.By default, the asynchronous statistics update option is off, and the query optimizer updates statistics synchronously. L'opzione AUTO_UPDATE_STATISTICS_ASYNC si applica a oggetti statistiche creati per indici, colonne singole nei predicati di query e statistiche create con l'istruzione CREATE STATISTICS .The AUTO_UPDATE_STATISTICS_ASYNC option applies to statistics objects created for indexes, single columns in query predicates, and statistics created with the CREATE STATISTICS statement.

    Gli aggiornamenti delle statistiche possono essere sincroni (impostazione predefinita) o asincroni.Statistics updates can be either synchronous (the default) or asynchronous. Con gli aggiornamenti sincroni delle statistiche, le query vengono sempre compilate ed eseguite con statistiche aggiornate. Se le statistiche sono obsolete, Query Optimizer rimane in attesa di statistiche aggiornate prima di compilare ed eseguire la query.With synchronous statistics updates, queries always compile and execute with up-to-date statistics; When statistics are out-of-date, the query optimizer waits for updated statistics before compiling and executing the query. Con gli aggiornamenti asincroni delle statistiche, le query vengono compilate con le statistiche esistenti anche non sono aggiornate. È possibile che Query Optimizer scelga un piano di query non ottimale se le statistiche non sono aggiornate al momento della compilazione della query.With asynchronous statistics updates, queries compile with existing statistics even if the existing statistics are out-of-date; The query optimizer could choose a suboptimal query plan if statistics are out-of-date when the query compiles. L'utilizzo di statistiche aggiornate offrirà vantaggi nelle query compilate dopo il completamento degli aggiornamenti asincroni.Queries that compile after the asynchronous updates have completed will benefit from using the updated statistics.

    Utilizzare le statistiche sincrone quando si eseguono operazioni che modificano la distribuzione dei dati, quali il troncamento di una tabella o l'esecuzione di un inserimento bulk di una percentuale elevata di righe.Consider using synchronous statistics when you perform operations that change the distribution of data, such as truncating a table or performing a bulk update of a large percentage of the rows. Se non si aggiornano le statistiche dopo avere completato l'operazione, l'utilizzo di statistiche sincrone garantisce che le statistiche vengano aggiornate prima di eseguire query sui dati modificati.If you do not update the statistics after completing the operation, using synchronous statistics will ensure statistics are up-to-date before executing queries on the changed data.

    Utilizzare le statistiche asincrone per ottenere tempi di risposta alle query più stimabili per gli scenari seguenti:Consider using asynchronous statistics to achieve more predictable query response times for the following scenarios:

  • L'applicazione esegue di frequente la stessa query, query analoghe o piani di query memorizzati nella cache analoghi.Your application frequently executes the same query, similar queries, or similar cached query plans. È possibile che gli aggiornamenti asincroni delle statistiche consentano di ottenere tempi di risposta alle query più stimabili rispetto agli aggiornamenti sincroni delle statistiche perché Query Optimizer può eseguire le query in entrata senza attendere le statistiche aggiornate.Your query response times might be more predictable with asynchronous statistics updates than with synchronous statistics updates because the query optimizer can execute incoming queries without waiting for up-to-date statistics. Ciò evita che alcune query vengano eseguite in ritardo rispetto ad altre.This avoids delaying some queries and not others.

  • Sono stati riscontrati timeout nelle richieste client causati da una o più query in attesa delle statistiche aggiornate.Your application has experienced client request time outs caused by one or more queries waiting for updated statistics. In alcuni casi, l'attesa delle statistiche sincrone può causare errori nelle applicazioni con timeout aggressivi.In some cases, waiting for synchronous statistics could cause applications with aggressive time outs to fail.

    INCREMENTAL STATSINCREMENTAL STATS
    Quando impostata su ON, le statistiche create sono di tipo per partizione.When ON, the statistics created are per partition statistics. Quando impostata su OFF, l'albero delle statistiche viene eliminato e le statistiche vengono rielaborate da SQL ServerSQL Server .When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. Il valore predefinito è OFF.The default is OFF. Questa impostazione esegue l'override della proprietà INCREMENTAL a livello di database.This setting overrides the database level INCREMENTAL property.

    Quando vengono aggiunte delle nuove partizioni a una tabella di grandi dimensioni, è necessario aggiornare le statistiche per includere le nuove partizioni.When new partitions are added to a large table, statistics should be updated to include the new partitions. Tuttavia, l'analisi dell'intera tabella (opzione FULLSCAN o SAMPLE) potrebbe richiedere diverso tempo.However the time required to scan the entire table (FULLSCAN or SAMPLE option) might be quite long. Inoltre, l'analisi dell'intera tabella non è necessaria in quanto occorrono solo le statistiche sulle nuove partizioni.Also, scanning the entire table isn't necessary because only the statistics on the new partitions might be needed. L'opzione Incrementale crea e archivia le statistiche in base alle partizioni, e quando viene eseguito un aggiornamento, permette di aggiornare solo le statistiche di quelle partizioni che richiedono nuove statistiche.The incremental option creates and stores statistics on a per partition basis, and when updated, only refreshes statistics on those partitions that need new statistics

    Se le statistiche per partizione non sono supportate, l'opzione viene ignorata e viene generato un avviso.If per partition statistics are not supported the option is ignored and a warning is generated. Le statistiche incrementali non sono supportate per i seguenti tipi di statistiche:Incremental stats are not supported for following statistics types:

  • Statistiche create con indici che non hanno il partizionamento allineato con la tabella di base.Statistics created with indexes that are not partition-aligned with the base table.

  • Statistiche create per i database secondari leggibili Always On.Statistics created on Always On readable secondary databases.

  • Statistiche create per i database di sola lettura.Statistics created on read-only databases.

  • Statistiche create per gli indici filtrati.Statistics created on filtered indexes.

  • Statistiche create per le viste.Statistics created on views.

  • Statistiche create per le tabelle interne.Statistics created on internal tables.

  • Statistiche create con indici spaziali o indici XML.Statistics created with spatial indexes or XML indexes.

||
|-|
|Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017.|

Quando creare le statistiche When to Create Statistics

Query Optimizer crea già le statistiche nelle modalità seguenti:The query optimizer already creates statistics in the following ways:

  1. Query Optimizer crea statistiche per gli indici in tabelle o viste, al momento della creazione dell'indice stesso.The query optimizer creates statistics for indexes on tables or views when the index is created. Tali statistiche vengono create nelle colonne chiave dell'indice.These statistics are created on the key columns of the index. Se l'indice è filtrato, Query Optimizer crea statistiche filtrate nello stesso subset di righe specificato per l'indice filtrato.If the index is a filtered index, the query optimizer creates filtered statistics on the same subset of rows specified for the filtered index. Per altre informazioni sugli indici filtrati, vedere Creare indici filtrati e CREATE INDEX (Transact-SQL).For more information about filtered indexes, see Create Filtered Indexes and CREATE INDEX (Transact-SQL).

  2. Quando AUTO_CREATE_STATISTICS è impostata su ON, Query Optimizer crea statistiche per le singole colonne nei predicati di query.The query optimizer creates statistics for single columns in query predicates when AUTO_CREATE_STATISTICS is on.

    Per la maggior parte delle query, questi due metodi di creazione delle statistiche garantiscono la definizione di un piano di query di alta qualità. In alcuni casi, è possibile migliorare i piani di query creando statistiche aggiuntive con l'istruzione CREATE STATISTICS .For most queries, these two methods for creating statistics ensure a high-quality query plan; in a few cases, you can improve query plans by creating additional statistics with the CREATE STATISTICS statement. Tali statistiche aggiuntive possono acquisire correlazioni statistiche che non vengono prese in considerazione in Query Optimizer durante la creazione di statistiche per indici o singole colonne.These additional statistics can capture statistical correlations that the query optimizer does not account for when it creates statistics for indexes or single columns. È possibile che nell'applicazione siano disponibili correlazioni statistiche aggiuntive nei dati della tabella che, se calcolate in un oggetto statistiche, possono consentire a Query Optimizer di migliorare i piani di query.Your application might have additional statistical correlations in the table data that, if calculated into a statistics object, could enable the query optimizer to improve query plans. Le statistiche filtrate per un subset di righe di dati o le statistiche multicolonna per le colonne dei predicati di query possono ad esempio migliorare il piano di query.For example, filtered statistics on a subset of data rows or multicolumn statistics on query predicate columns might improve the query plan.

    Quando si creano statistiche con l'istruzione CREATE STATISTICS, si consiglia di mantenere l'opzione AUTO_CREATE_STATISTICS impostata su ON, in modo tale che Query Optimizer continui a creare regolarmente statistiche di colonna singola per le colonne dei predicati di query.When creating statistics with the CREATE STATISTICS statement, we recommend keeping the AUTO_CREATE_STATISTICS option on so that the query optimizer continues to routinely create single-column statistics for query predicate columns. Per altre informazioni sui predicati, vedere Condizione di ricerca(Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

    Utilizzare l'istruzione CREATE STATISTICS per creare statistiche in una delle seguenti condizioni:Consider creating statistics with the CREATE STATISTICS statement when any of the following applies:

  • In Ottimizzazione guidata Motore di databaseDatabase Engine viene indicato di creare statistiche.The Motore di databaseDatabase Engine Tuning Advisor suggests creating statistics.

  • Il predicato di query contiene più colonne correlate che non si trovano ancora nello stesso indice.The query predicate contains multiple correlated columns that are not already in the same index.

  • La query effettua la selezione da un subset di dati.The query selects from a subset of data.

  • La query presenta statistiche mancanti.The query has missing statistics.

Il predicato di query contiene più colonne correlateQuery Predicate Contains Multiple Correlated Columns

Quando il predicato di una query contiene più colonne correlate e dipendenti tra loro, è possibile che la creazione di statistiche per più colonne consenta di migliorare il piano di query.When a query predicate contains multiple columns that have cross-column relationships and dependencies, statistics on the multiple columns might improve the query plan. Le statistiche su più colonne contengono le statistiche sulla correlazione tra colonne, denominate densità, le quali non sono disponili nelle statistiche di colonna singola.Statistics on multiple columns contain cross-column correlation statistics, called densities, that are not available in single-column statistics. Le densità possono migliorare le stime della cardinalità qualora i risultati della query dipendano da relazioni tra i dati di più colonne.Densities can improve cardinality estimates when query results depend on data relationships among multiple columns.

Se le colonne si trovano già nello stesso indice, l'oggetto statistiche multicolonna esiste già e non è necessario crearlo manualmente.If the columns are already in the same index, the multicolumn statistics object already exists and it is not necessary to create it manually. Se le colonne ancora non si trovano nello stesso indice, è possibile creare le statistiche multicolonna tramite un indice nelle colonne o l'istruzione CREATE STATISTICS.If the columns are not already in the same index, you can create multicolumn statistics by creating an index on the columns or by using the CREATE STATISTICS statement. La gestione di un indice richiede più risorse di sistema rispetto a un oggetto statistiche.It requires more system resources to maintain an index than a statistics object. Se l'applicazione non richiede l'indice multicolonna, è possibile utilizzare una quantità ridotta di risorse di sistema creando l'oggetto statistiche senza creare l'indice.If the application does not require the multicolumn index, you can economize on system resources by creating the statistics object without creating the index.

Quando si creano le statistiche multicolonna, l'ordine delle colonne nella definizione dell'oggetto statistiche influisce sull'efficacia delle densità nel calcolo delle stime della cardinalità.When creating multicolumn statistics, the order of the columns in the statistics object definition affects the effectiveness of densities for making cardinality estimates. L'oggetto statistiche archivia le densità per ciascun prefisso delle colonne chiave nella definizione dell'oggetto statistiche.The statistics object stores densities for each prefix of key columns in the statistics object definition. Per altre informazioni sulle densità, vedere DBCC SHOW_STATISTICS (Transact-SQL).For more information about densities, see DBCC SHOW_STATISTICS (Transact-SQL).

Per creare densità utili per le stime della cardinalità, è necessario che le colonne nel predicato di query corrispondano a uno dei prefissi delle colonne nella definizione dell'oggetto statistiche.To create densities that are useful for cardinality estimates, the columns in the query predicate must match one of the prefixes of columns in the statistics object definition. Di seguito viene ad esempio creato un oggetto statistiche multicolonna per le colonne LastName, MiddleNamee FirstName.For example, the following creates a multicolumn statistics object on the columns LastName, MiddleName, and FirstName.

USE AdventureWorks2012;  
GO  
IF EXISTS (SELECT name FROM sys.stats  
    WHERE name = 'LastFirst'  
    AND object_ID = OBJECT_ID ('Person.Person'))  
DROP STATISTICS Person.Person.LastFirst;  
GO  
CREATE STATISTICS LastFirst ON Person.Person (LastName, MiddleName, FirstName);  
GO  

In questo esempio, l'oggetto statistiche LastFirst dispone delle densità per i seguenti prefissi di colonna: (LastName), (LastName, MiddleName) e (LastName, MiddleName, FirstName).In this example, the statistics object LastFirst has densities for the following column prefixes: (LastName), (LastName, MiddleName), and (LastName, MiddleName, FirstName). La densità non è disponibile per (LastName, FirstName).The density is not available for (LastName, FirstName). Se la query utilizza LastName e FirstName senza utilizzare MiddleName, la densità non è disponibile per le stime della cardinalità.If the query uses LastName and FirstName without using MiddleName, the density is not available for cardinality estimates.

La query effettua la selezione da un subset di datiQuery Selects from a Subset of Data

La creazione di statistiche per indici e colonne singole in Query Optimizer implica la creazione di statistiche per i valori in tutte le righe.When the query optimizer creates statistics for single columns and indexes, it creates the statistics for the values in all rows. Quando le query effettuano la selezione da un subset di righe che dispone di una distribuzione dei dati univoca, le statistiche filtrate possono migliorare i piani di query.When queries select from a subset of rows, and that subset of rows has a unique data distribution, filtered statistics can improve query plans. È possibile creare le statistiche filtrate utilizzando l'istruzione CREATE STATISTICS con la clausola WHERE per definire l'espressione del predicato del filtro.You can create filtered statistics by using the CREATE STATISTICS statement with the WHERE clause to define the filter predicate expression.

Se ad esempio si utilizza AdventureWorks2012AdventureWorks2012, ogni prodotto nella tabella Production.Product appartiene a una delle quattro categorie della tabella Production.ProductCategory, ovvero Bikes, Components, Clothing e Accessories.For example, using AdventureWorks2012AdventureWorks2012, each product in the Production.Product table belongs to one of four categories in the Production.ProductCategory table: Bikes, Components, Clothing, and Accessories. Ogni categoria dispone di una distribuzione dei dati diversa in relazione al peso. I pesi nella categoria Bikes sono compresi tra 13,77 e 30, quelli della categoria Components sono compresi tra 2,12 e 1.050 con alcuni valori NULL e quelli delle categorie Clothing e Accessories sono tutti NULL.Each of the categories has a different data distribution for weight: bike weights range from 13.77 to 30.0, component weights range from 2.12 to 1050.00 with some NULL values, clothing weights are all NULL, and accessory weights are also NULL.

Prendendo come esempio la categoria Bikes, le statistiche filtrate per tutti i pesi consentono di fornire a Query Optimizer statistiche più accurate e di migliorare la qualità del piano di query rispetto alle statistiche di tabella completa o alle statistiche inesistenti nella colonna relativa al peso (Weight).Using Bikes as an example, filtered statistics on all bike weights will provide more accurate statistics to the query optimizer and can improve the query plan quality compared with full-table statistics or nonexistent statistics on the Weight column. La colonna Weight della categoria Bikes rappresenta un candidato valido per le statistiche filtrate. Nel caso di un numero relativamente ridotto di ricerche correlate al peso, tale colonna non è tuttavia necessariamente un candidato valido per un indice filtrato.The bike weight column is a good candidate for filtered statistics but not necessarily a good candidate for a filtered index if the number of weight lookups is relatively small. È possibile che i vantaggi derivanti dai miglioramenti alle prestazioni delle ricerche offerti da un indice filtrato siano inferiori rispetto agli svantaggi derivanti dai costi di manutenzione e archiviazione supplementari dovuti all'aggiunta di un indice filtrato al database.The performance gain for lookups that a filtered index provides might not outweigh the additional maintenance and storage cost for adding a filtered index to the database.

L'istruzione seguente crea le statistiche filtrate di BikeWeights per tutte le sottocategorie di Bikes.The following statement creates the BikeWeights filtered statistics on all of the subcategories for Bikes. L'espressione del predicato filtrata definisce le biciclette (Bikes) enumerando tutte le sottocategorie di Bikes con l'elemento Production.ProductSubcategoryID IN (1,2,3)di confronto.The filtered predicate expression defines bikes by enumerating all of the bike subcategories with the comparison Production.ProductSubcategoryID IN (1,2,3). Il predicato non può utilizzare il nome di categoria Bikes perché viene archiviato nella tabella Production.ProductCategory e tutte le colonne nell'espressione di filtro devono trovarsi nella stessa tabella.The predicate cannot use the Bikes category name because it is stored in the Production.ProductCategory table, and all columns in the filter expression must be in the same table.

USE AdventureWorks2012;
GO
IF EXISTS ( SELECT name FROM sys.stats
    WHERE name = 'BikeWeights'
    AND object_ID = OBJECT_ID ('Production.Product'))
DROP STATISTICS Production.Product.BikeWeights;
GO
CREATE STATISTICS BikeWeights
    ON Production.Product (Weight)
WHERE ProductSubcategoryID IN (1,2,3);
GO

Query Optimizer può utilizzare le statistiche filtrate di BikeWeights per migliorare il piano di query per la query seguente che seleziona tutti gli elementi della categoria Bikes con peso maggiore di 25.The query optimizer can use the BikeWeights filtered statistics to improve the query plan for the following query that selects all of the bikes that weigh more than 25.

SELECT P.Weight AS Weight, S.Name AS BikeName  
FROM Production.Product AS P  
    JOIN Production.ProductSubcategory AS S   
    ON P.ProductSubcategoryID = S.ProductSubcategoryID  
WHERE P.ProductSubcategoryID IN (1,2,3) AND P.Weight > 25  
ORDER BY P.Weight;  
GO  

La query identifica le statistiche mancantiQuery Identifies Missing Statistics

Se un errore o un altro evento impedisce la creazione di statistiche da parte di Query Optimizer, il piano di query viene creato senza utilizzare statistiche.If an error or other event prevents the query optimizer from creating statistics, the query optimizer creates the query plan without using statistics. Query Optimizer contrassegna le statistiche come mancanti e tenta di rigenerare le statistiche alla successiva esecuzione della query.The query optimizer marks the statistics as missing and attempts to regenerate the statistics the next time the query is executed.

Le statistiche mancanti sono indicate come avvisi (nome della tabella in rosso) quando il piano di esecuzione di una query viene visualizzato graficamente utilizzando SQL Server Management StudioSQL Server Management Studio.Missing statistics are indicated as warnings (table name in red text) when the execution plan of a query is graphically displayed using SQL Server Management StudioSQL Server Management Studio. Il monitoraggio della classe di eventi Missing Column Statistics con SQL Server ProfilerSQL Server Profiler indica anche i casi in cui le statistiche risultano mancanti.Additionally, monitoring the Missing Column Statistics event class by using SQL Server ProfilerSQL Server Profiler indicates when statistics are missing. Per altre informazioni, vedere Categoria di eventi Errori e avvisi (Motore di database).For more information, see Errors and Warnings Event Category (Database Engine).

In caso di statistiche mancanti, effettuare quanto segue:If statistics are missing, perform the following steps:

  • Verificare che AUTO_CREATE_STATISTICS e AUTO_UPDATE_STATISTICS siano impostate su ON.Verify that AUTO_CREATE_STATISTICS and AUTO_UPDATE_STATISTICS are on.

  • Verificare che il database non sia di sola lettura.Verify that the database is not read-only. Se il database è di sola lettura, Query Optimizer non è in grado di salvare le statistiche.If the database is read-only, the query optimizer cannot save statistics.

  • Creare le statistiche mancanti mediante l'istruzione CREATE STATISTICS.Create the missing statistics by using the CREATE STATISTICS statement.

    Quando le statistiche su uno snapshot o un database di sola lettura sono mancanti o non aggiornate, il Motore di databaseDatabase Engine crea e gestisce statistiche temporanee in tempdb.When statistics on a read-only database or read-only snapshot are missing or stale, the Motore di databaseDatabase Engine creates and maintains temporary statistics in tempdb. Quando il Motore di databaseDatabase Engine crea statistiche temporanee, al nome delle statistiche viene aggiunto il suffisso _readonly_database_statistic per distinguere le statistiche temporanee da quelle permanenti.When the Motore di databaseDatabase Engine creates temporary statistics, the statistics name is appended with the suffix _readonly_database_statistic to differentiate the temporary statistics from the permanent statistics. Il suffisso _readonly_database_statistic è riservato alle statistiche generate da SQL ServerSQL Server.The suffix _readonly_database_statistic is reserved for statistics generated by SQL ServerSQL Server. È possibile creare script per le statistiche temporanee e riprodurli in un database di lettura e scrittura.Scripts for the temporary statistics can be created and reproduced on a read-write database. Quando viene creato uno script, Management StudioManagement Studio modifica il suffisso del nome delle statistiche da _readonly_database_statistic a _readonly_database_statistic_scripted.When scripted, Management StudioManagement Studio changes the suffix of the statistics name from _readonly_database_statistic to _readonly_database_statistic_scripted.

    Solo in SQL ServerSQL Server è possibile creare e aggiornare le statistiche temporanee.Only SQL ServerSQL Server can create and update temporary statistics. È tuttavia possibile eliminare le statistiche temporanee e monitorare le relative proprietà utilizzando gli stessi strumenti utilizzati per le statistiche permanenti:However, you can delete temporary statistics and monitor statistics properties using the same tools that you use for permanent statistics:

  • Eliminare le statistiche temporanee usando l'istruzione DROP STATISTICS (Transact-SQL) .Delete temporary statistics using the DROP STATISTICS (Transact-SQL) statement.

  • Monitorare le statistiche usando le viste del catalogo sys.stats e sys.stats_columns .Monitor statistics using the sys.stats and sys.stats_columns catalog views. sys_stats include una colonna, is_temporary , che indica quali statistiche sono permanenti e quali invece temporanee.sys_stats includes the is_temporary column, to indicate which statistics are permanent and which are temporary.

    Poiché le statistiche temporanee sono archiviate in tempdb, un riavvio del servizio SQL ServerSQL Server comporta l'indisponibilità di tutte le statistiche temporanee.Because temporary statistics are stored in tempdb, a restart of the SQL ServerSQL Server service causes all temporary statistics to disappear.

Quando aggiornare le statistiche When to Update Statistics

Query Optimizer determina che le statistiche potrebbero non essere aggiornate, quindi ne effettua l'aggiornamento qualora siano necessarie per un piano di query.The query optimizer determines when statistics might be out-of-date and then updates them when they are needed for a query plan. In alcuni casi, è possibile migliorare il piano di query e le prestazioni di esecuzione delle query aggiornando le statistiche più frequentemente di quanto accada quando AUTO_UPDATE_STATISTICS è impostata su ON.In some cases you can improve the query plan and therefore improve query performance by updating statistics more frequently than occur when AUTO_UPDATE_STATISTICS is on. È possibile aggiornare le statistiche mediante l'istruzione UPDATE STATISTICS o la stored procedure sp_updatestats.You can update statistics with the UPDATE STATISTICS statement or the stored procedure sp_updatestats.

Sebbene consenta di garantire che le query vengano compilate con statistiche aggiornate,Updating statistics ensures that queries compile with up-to-date statistics. l'aggiornamento delle statistiche causa la ricompilazione delle query.However, updating statistics causes queries to recompile. 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.We recommend not updating statistics too frequently because there is a performance tradeoff between improving query plans and the time it takes to recompile queries. Tale equilibrio dipende dall'applicazione in uso.The specific tradeoffs depend on your application.

Quando si utilizza UPDATE STATISTICS o sp_updatestats per aggiornare le statistiche, mantenere AUTO_UPDATE_STATISTICS impostata su ON, affinché l'aggiornamento continui a essere eseguito regolarmente in Query Optimizer.When updating statistics with UPDATE STATISTICS or sp_updatestats, we recommend keeping AUTO_UPDATE_STATISTICS set to ON so that the query optimizer continues to routinely update statistics. Per altre informazioni sull'aggiornamento delle statistiche per una colonna, un indice, una tabella o una vista indicizzata, vedere UPDATE STATISTICS (Transact-SQL).For more information about how to update statistics on a column, an index, a table, or an indexed view, see UPDATE STATISTICS (Transact-SQL). Per informazioni sull'aggiornamento delle statistiche per tutte le tabelle interne e definite dall'utente nel database, vedere la stored procedure sp_updatestats (Transact-SQL).For information about how to update statistics for all user-defined and internal tables in the database, see the stored procedure sp_updatestats (Transact-SQL).

Per determinare la data dell'ultimo aggiornamento delle statistiche, usare la funzione STATS_DATE .To determine when statistics were last updated, use the STATS_DATE function.

Aggiornare le statistiche nei seguenti casi:Consider updating statistics for the following conditions:

  • I tempi di esecuzione delle query sono particolarmente lunghi.Query execution times are slow.

  • Si verificano operazioni di inserimento in colonne chiave crescenti o decrescenti.Insert operations occur on ascending or descending key columns.

  • In seguito a operazioni di manutenzione.After maintenance operations.

I tempi di esecuzione delle query sono particolarmente lunghiQuery Execution Times Are Slow

Se i tempi di risposta alle query sono troppo lunghi o imprevedibili, assicurarsi che le query dispongano di statistiche aggiornate prima di eseguire ulteriori procedure di risoluzione dei problemi.If query response times are slow or unpredictable, ensure that queries have up-to-date statistics before performing additional troubleshooting steps.

Si verificano operazioni di inserimento in colonne chiave crescenti o decrescentiInsert Operations Occur on Ascending or Descending Key Columns

È possibile che le statistiche per colonne chiave crescenti o decrescenti, ad esempio colonne IDENTITY o timestamp in tempo reale, richiedano aggiornamenti più frequenti rispetto a quelli previsti in Query Optimizer.Statistics on ascending or descending key columns, such as IDENTITY or real-time timestamp columns, might require more frequent statistics updates than the query optimizer performs. Le operazioni di inserimento accodano nuovi valori alle colonne crescenti o decrescenti.Insert operations append new values to ascending or descending columns. È possibile che il numero di righe aggiunte non sia sufficiente per attivare un aggiornamento delle statistiche.The number of rows added might be too small to trigger a statistics update. Se le statistiche non sono aggiornate e le query effettuano la selezione dalle righe aggiunte più di recente, le statistiche correnti non disporranno delle stime della cardinalità per tali nuovi valori.If statistics are not up-to-date and queries select from the most recently added rows, the current statistics will not have cardinality estimates for these new values. Ciò può comportare imprecisioni nelle stime della cardinalità e prestazioni di esecuzione delle query ridotte.This can result in inaccurate cardinality estimates and slow query performance.

Le stime della cardinalità di una query che effettua la selezione dalle date degli ordini di vendita più recenti non saranno ad esempio precise se le statistiche non sono aggiornate in modo da includere le stime della cardinalità di tali date.For example, a query that selects from the most recent sales order dates will have inaccurate cardinality estimates if the statistics are not updated to include cardinality estimates for the most recent sales order dates.

In seguito a operazioni di manutenzioneAfter Maintenance Operations

Aggiornare le statistiche dopo avere eseguito procedure di manutenzione che modificano la distribuzione dei dati, quali il troncamento di una tabella o l'esecuzione di un inserimento bulk di un'elevata percentuale di righe.Consider updating statistics after performing maintenance procedures that change the distribution of data, such as truncating a table or performing a bulk insert of a large percentage of the rows. Ciò consente di evitare ritardi futuri nell'elaborazione delle query causati dall'attesa da parte delle query stesse degli aggiornamenti automatici delle statistiche.This can avoid future delays in query processing while queries wait for automatic statistics updates.

Operazioni quali la ricompilazione, la deframmentazione o la riorganizzazione di un indice non modificano la distribuzione dei dati.Operations such as rebuilding, defragmenting, or reorganizing an index do not change the distribution of data. Non è pertanto necessario aggiornare le statistiche in seguito all'esecuzione di operazioni ALTER INDEX REBUILD, DBCC REINDEX, DBCC INDEXDEFRAG o ALTER INDEX REORGANIZE.Therefore, you do not need to update statistics after performing ALTER INDEX REBUILD, DBCC REINDEX, DBCC INDEXDEFRAG, or ALTER INDEX REORGANIZE operations. L'aggiornamento delle statistiche viene eseguito in Query Optimizer in seguito alla ricompilazione di un indice in una tabella o una vista mediante ALTER INDEX REBUILD o DBCC DBREINDEX. Tale aggiornamento delle statistiche è tuttavia il risultato della ricostruzione dell'indice.The query optimizer updates statistics when you rebuild an index on a table or view with ALTER INDEX REBUILD or DBCC DBREINDEX, however; this statistics update is a byproduct of re-creating the index. L'aggiornamento delle statistiche non viene eseguito in Query Optimizer dopo operazioni DBCC INDEXDEFRAG o ALTER INDEX REORGANIZE.The query optimizer does not update statistics after DBCC INDEXDEFRAG or ALTER INDEX REORGANIZE operations.

Query in cui vengono usate le statistiche in modo efficace Queries That Use Statistics Effectively

Alcune implementazioni delle query, quali le variabili locali e le espressioni complesse nel predicato di query, possono comportare la definizione di piani di query non ottimali.Certain query implementations, such as local variables and complex expressions in the query predicate, can lead to suboptimal query plans. Per evitare che ciò accada, attenersi alle linee guida relative alla progettazione delle query per un utilizzo efficace delle statistiche.Following query design guidelines for using statistics effectively can help to avoid this. Per altre informazioni sui predicati, vedere Condizione di ricerca(Transact-SQL).For more information about query predicates, see Search Condition (Transact-SQL).

È possibile migliorare i piani di query applicando le linee guida relative alla progettazione delle query che prevedono un utilizzo efficace delle statistiche, al fine di migliorare le stime della cardinalità per espressioni, variabili e funzioni usate nei predicati di query.You can improve query plans by applying query design guidelines that use statistics effectively to improve cardinality estimates for expressions, variables, and functions used in query predicates. Se il valore di un'espressione, di una variabile o di una funzione non è noto, Query Optimizer non è in grado di determinare il valore da ricercare nell'istogramma e non può pertanto recuperare la stima della cardinalità ottimale dall'istogramma.When the query optimizer does not know the value of an expression, variable, or function, it does not know which value to lookup in the histogram and therefore cannot retrieve the best cardinality estimate from the histogram. In tal caso, la stima della cardinalità di Query Optimizer si basa sul numero medio di righe per valore distinct per tutte le righe campionate nell'istogramma.Instead, the query optimizer bases the cardinality estimate on the average number of rows per distinct value for all of the sampled rows in the histogram. Ciò comporta stime della cardinalità non ottimali e può causare una riduzione delle prestazioni di esecuzione delle query.This leads to suboptimal cardinality estimates and can hurt query performance.

Nelle linee guida seguenti viene indicato come scrivere query per migliorare i piani di query grazie all'ottimizzazione delle stime della cardinalità.The following guidelines describe how to write queries to improve query plans by improving cardinality estimates.

Miglioramento delle stime della cardinalità per le espressioniImproving Cardinality Estimates for Expressions

Per migliorare le stime della cardinalità per le espressioni, attenersi alle seguenti linee guida:To improve cardinality estimates for expressions, follow these guidelines:

  • Se possibile, semplificare le espressioni contenenti costanti.Whenever possible, simplify expressions with constants in them. Query Optimizer non valuta tutte le funzioni e le espressioni che contengono costanti prima di determinare le stime della cardinalità.The query optimizer does not evaluate all functions and expressions containing constants prior to determining cardinality estimates. Semplificare ad esempio l'espressione ABS(-100) to 100.For example, simplify the expression ABS(-100) to 100.

  • Se l'espressione utilizza più variabili, creare una colonna calcolata per l'espressione, quindi creare le statistiche o un indice nella colonna calcolata.If the expression uses multiple variables, consider creating a computed column for the expression and then create statistics or an index on the computed column. È ad esempio possibile che la stima della cardinalità del predicato di query WHERE PRICE + Tax > 100 sia migliore se si crea una colonna calcolata per l'espressione Price + Tax.For example, the query predicate WHERE PRICE + Tax > 100 might have a better cardinality estimate if you create a computed column for the expression Price + Tax.

Miglioramento delle stime della cardinalità per variabili e funzioniImproving Cardinality Estimates for Variables and Functions

Per migliorare le stime della cardinalità per variabili e funzioni, attenersi alle seguenti linee guida:To improve the cardinality estimates for variables and functions, follow these guidelines:

  • Se nel predicato di query viene utilizzata una variabile locale, riscrivere la query in modo da utilizzare un parametro anziché una variabile locale.If the query predicate uses a local variable, consider rewriting the query to use a parameter instead of a local variable. Il valore di una variabile locale non è noto quando Query Optimizer crea il piano di esecuzione della query.The value of a local variable is not known when the query optimizer creates the query execution plan. Quando una query utilizza un parametro, Query Optimizer utilizza la stima della cardinalità per il primo valore di parametro effettivo passato alla stored procedure.When a query uses a parameter, the query optimizer uses the cardinality estimate for the first actual parameter value that is passed to the stored procedure.

  • Utilizzare una tabella standard o una tabella temporanea per archiviare i risultati di funzioni con valori di tabella con più istruzioni.Consider using a standard table or temporary table to hold the results of multi-statement table-valued functions. Query Optimizer non crea statistiche per le funzioni con valori di tabella con più istruzioni.The query optimizer does not create statistics for multi-statement table-valued functions. In questo modo, Query Optimizer è in grado di creare statistiche per le colonne della tabella e utilizzarle per definire un piano di query più efficace.With this approach the query optimizer can create statistics on the table columns and use them to create a better query plan.

  • Utilizzare una tabella standard o una tabella temporanea in sostituzione delle variabili di tabella.Consider using a standard table or temporary table as a replacement for table variables. Query Optimizer non crea statistiche per le variabili di tabella.The query optimizer does not create statistics for table variables. In questo modo, Query Optimizer è in grado di creare statistiche per le colonne della tabella e utilizzarle per definire un piano di query più efficace.With this approach the query optimizer can create statistics on the table columns and use them to create a better query plan. Diversi elementi determinano l'opportunità di utilizzare una tabella temporanea o una variabile di tabella. Le variabili di tabella utilizzate nelle stored procedure causano un numero di ricompilazioni delle stored procedure inferiore rispetto alle tabelle temporanee.There are tradeoffs in determining whether to use a temporary table or a table variable; Table variables used in stored procedures cause fewer recompilations of the stored procedure than temporary tables. In base all'applicazione in uso, è possibile che l'utilizzo di una tabella temporanea al posto di una variabile di tabella non comporti un miglioramento delle prestazioni.Depending on the application, using a temporary table instead of a table variable might not improve performance.

  • Se una stored procedure contiene una query che utilizza un parametro passato, evitare di modificare il valore del parametro all'interno della stored procedure prima di utilizzarlo nella query.If a stored procedure contains a query that uses a passed-in parameter, avoid changing the parameter value within the stored procedure before using it in the query. Le stime della cardinalità per la query sono basate sul valore del parametro passato, non sul valore aggiornato.The cardinality estimates for the query are based on the passed-in parameter value and not the updated value. Per evitare di modificare il valore del parametro, è possibile riscrivere la query in modo da utilizzare due stored procedure.To avoid changing the parameter value, you can rewrite the query to use two stored procedures.

    La seguente stored procedure Sales.GetRecentSales modifica ad esempio il valore del parametro @date se @date is NULL.For example, the following stored procedure Sales.GetRecentSales changes the value of the parameter @date when @date is NULL.

    USE AdventureWorks2012;  
    GO  
    IF OBJECT_ID ( 'Sales.GetRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetRecentSales (@date datetime)  
    AS BEGIN  
        IF @date is NULL  
            SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
        SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
        WHERE h.SalesOrderID = d.SalesOrderID  
        AND h.OrderDate > @date  
    END  
    GO  
    

    Se la prima chiamata alla stored procedure Sales.GetRecentSales passa un valore NULL per il parametro @date , Query Optimizer compilerà la stored procedure con la stima della cardinalità per @date = NULL anche se il predicato di query non è chiamato con @date = NULL.If the first call to the stored procedure Sales.GetRecentSales passes a NULL for the @date parameter, the query optimizer will compile the stored procedure with the cardinality estimate for @date = NULL even though the query predicate is not called with @date = NULL. È possibile che tale stima della cardinalità differisca notevolmente rispetto al numero di righe nel risultato della query effettivo.This cardinality estimate might be significantly different than the number of rows in the actual query result. È pertanto possibile che in Query Optimizer venga scelto un piano di query non ottimale.As a result, the query optimizer might choose a suboptimal query plan. Per evitare che ciò accada, è possibile riscrivere la stored procedure utilizzando due procedure, come illustrato di seguito:To help avoid this, you can rewrite the stored procedure into two procedures as follows:

    USE AdventureWorks2012;  
    GO  
    IF OBJECT_ID ( 'Sales.GetNullRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetNullRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetNullRecentSales (@date datetime)  
    AS BEGIN  
        IF @date is NULL  
            SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
        EXEC Sales.GetNonNullRecentSales @date;  
    END  
    GO  
    IF OBJECT_ID ( 'Sales.GetNonNullRecentSales', 'P') IS NOT NULL  
        DROP PROCEDURE Sales.GetNonNullRecentSales;  
    GO  
    CREATE PROCEDURE Sales.GetNonNullRecentSales (@date datetime)  
    AS BEGIN  
        SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
        WHERE h.SalesOrderID = d.SalesOrderID  
        AND h.OrderDate > @date  
    END  
    GO  
    

Miglioramento delle stime della cardinalità con gli hint per la queryImproving Cardinality Estimates with Query Hints

Per migliorare le stime della cardinalità per le variabili locali, è possibile utilizzare gli hint per la query OPTIMIZE FOR o OPTIMIZE FOR UNKNOWN con RECOMPILE.To improve cardinality estimates for local variables, you can use the OPTIMIZE FOR or OPTIMIZE FOR UNKNOWN query hints with RECOMPILE. Per altre informazioni, vedere Hint per la query (Transact-SQL).For more information, see Query Hints (Transact-SQL).

In alcune applicazioni, la ricompilazione della query ogni volta che viene eseguita può richiedere tempi troppo lunghi.For some applications, recompiling the query each time it executes might take too much time. L'hint per la query OPTIMIZER FOR può risultare utile anche se non si utilizza l'opzione RECOMPILE.The OPTIMIZER FOR query hint can help even if you don't use the RECOMPILE option. È possibile ad esempio aggiungere un'opzione OPTIMIZER FOR alla stored procedure Sales.GetRecentSales per indicare una data specifica.For example, you could add an OPTIMIZER FOR option to the stored procedure Sales.GetRecentSales to specify a specific date. Nell'esempio seguente viene aggiunta l'opzione OPTIMIZE FOR alla procedura Sales.GetRecentSales.The following example adds the OPTIMIZE FOR option to the Sales.GetRecentSales procedure.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ( 'Sales.GetRecentSales', 'P') IS NOT NULL  
    DROP PROCEDURE Sales.GetRecentSales;  
GO  
CREATE PROCEDURE Sales.GetRecentSales (@date datetime)  
AS BEGIN  
    IF @date is NULL  
        SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader))  
    SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d  
    WHERE h.SalesOrderID = d.SalesOrderID  
    AND h.OrderDate > @date  
    OPTION ( OPTIMIZE FOR ( @date = '2004-05-01 00:00:00.000'))  
END;  
GO  

Miglioramento delle stime della cardinalità con le guide di pianoImproving Cardinality Estimates with Plan Guides

È possibile che le linee guida relative alla progettazione delle query non siano valide per alcune applicazioni, in quanto non è possibile modificare la query o l'utilizzo dell'hint per la query RECOMPILE potrebbe causare un numero eccessivo di ricompilazioni.For some applications, query design guidelines might not apply because you cannot change the query or using the RECOMPILE query hint might be cause too many recompiles. È possibile utilizzare le guide di piano per specificare altri hint, ad esempio USE PLAN, in modo da controllare il comportamento della query mentre si collabora con il fornitore dell'applicazione per esaminarne le modifiche.You can use plan guides to specify other hints, such as USE PLAN, to control the behavior of the query while investigating application changes with the application vendor. Per altre informazioni sulle guide di piano, vedere Guide di piano.For more information about plan guides, see Plan Guides.

Vedere ancheSee Also

CREATE STATISTICS (Transact-SQL) CREATE STATISTICS (Transact-SQL)
UPDATE STATISTICS (Transact-SQL) UPDATE STATISTICS (Transact-SQL)
sp_updatestats (Transact-SQL) sp_updatestats (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
Opzioni di ALTER DATABASE SET (Transact-SQL) ALTER DATABASE SET Options (Transact-SQL)
DROP STATISTICS (Transact-SQL) DROP STATISTICS (Transact-SQL)
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
Creare indici filtrati Create Filtered Indexes