Hint (Transact-SQL) - QueryHints (Transact-SQL) - Query

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

Gli hint per la query specificano che gli hint indicati devono essere utilizzati in tutta la queryQuery hints specify that the indicated hints should be used throughout the query. e influiscono su tutti gli operatori dell'istruzione.They affect all operators in the statement. Se la query principale include l'operatore UNION, la clausola OPTION può essere specificata solo nell'ultima query che prevede un'operazione di tipo UNION.If UNION is involved in the main query, only the last query involving a UNION operation can have the OPTION clause. Gli hint per la query vengono specificati come parte della clausola OPTION.Query hints are specified as part of the OPTION clause. Se in seguito alla presenza di uno o più hint per la query non viene creato un piano valido da Query Optimizer, viene generato l'errore 8622.If one or more query hints cause the query optimizer not to generate a valid plan, error 8622 is raised.

Attenzione

Poiché Query Optimizer di SQL ServerSQL Server in genere seleziona il piano di esecuzione migliore per una query, è consigliabile utilizzare hint solo se strettamente necessario e sempre da parte di sviluppatori e amministratori esperti di database.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend only using hints as a last resort for experienced developers and database administrators.

Si applica a:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

<query_hint > ::=   
{ { HASH | ORDER } GROUP   
  | { CONCAT | HASH | MERGE } UNION   
  | { LOOP | MERGE | HASH } JOIN   
  | EXPAND VIEWS   
  | FAST number_rows   
  | FORCE ORDER   
  | { FORCE | DISABLE } EXTERNALPUSHDOWN  
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX  
  | KEEP PLAN   
  | KEEPFIXED PLAN  
  | MAX_GRANT_PERCENT = percent  
  | MIN_GRANT_PERCENT = percent  
  | MAXDOP number_of_processors   
  | MAXRECURSION number   
  | NO_PERFORMANCE_SPOOL   
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )  
  | OPTIMIZE FOR UNKNOWN  
  | PARAMETERIZATION { SIMPLE | FORCED }  
  | RECOMPILE  
  | ROBUST PLAN   
  | USE HINT ( '<hint_name>' [ , ...n ] )
  | USE PLAN N'xml_plan'  | TABLE HINT ( exposed_object_name [ , <table_hint> [ [, ]...n ] ] )  
}  

<table_hint> ::=  
[ NOEXPAND ] {   
    INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value )  
  | FORCESEEK [( index_value ( index_column_name [,... ] ) ) ]  
  | FORCESCAN  
  | HOLDLOCK   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | READUNCOMMITTED   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT  
  | SPATIAL_WINDOW_MAX_CELLS = integer  
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK  
}  

ArgomentiArguments

{ HASH | ORDER } GROUP{ HASH | ORDER } GROUP
Specifica che nelle funzioni di aggregazione elencate nella clausola GROUP BY o DISTINCT della query devono essere utilizzate operazioni di hashing o di ordinamento.Specifies that aggregations described in the GROUP BY, or DISTINCT clause of the query should use hashing or ordering.

{ MERGE | HASH | CONCAT } UNION{ MERGE | HASH | CONCAT } UNION
Specifica che per tutte le operazioni UNION vengono eseguite operazioni di unione, hashing o concatenazione dei set UNION.Specifies that all UNION operations are performed by merging, hashing, or concatenating UNION sets. Se viene specificato più di un hint UNION, Query Optimizer seleziona la strategia meno onerosa tra gli hint specificati.If more than one UNION hint is specified, the query optimizer selects the least expensive strategy from those hints specified.

{ LOOP | MERGE | HASH } JOIN{ LOOP | MERGE | HASH } JOIN
Specifica che tutte le operazioni JOIN vengono eseguite da LOOP JOIN, MERGE JOIN o HASH JOIN nell'intera query.Specifies that all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. Se vengono specificati più hint di join, Query Optimizer seleziona la strategia di join meno onerosa tra i join consentiti.If more than one join hint is specified, the optimizer selects the least expensive join strategy from the allowed ones.

Se nella stessa query un hint di join viene specificato nella clausola FROM anche per una particolare coppia di tabelle, tale hint risulta prioritario rispetto all'unione in join delle due tabelle. Gli hint per la query devono essere comunque rispettati.If, in the same query, a join hint is also specified in the FROM clause for a specific pair of tables, this join hint takes precedence in the joining of the two tables, although the query hints still must be honored. L'hint di join della coppia di tabelle pertanto consente di limitare solo la selezione dei metodi di join consentiti nell'hint per la query.Therefore, the join hint for the pair of tables may only restrict the selection of allowed join methods in the query hint. Per altre informazioni, vedere Hint (Transact-SQL) - Join.For more information, see Join Hints (Transact-SQL).

EXPAND VIEWSEXPAND VIEWS
Specifica che le viste indicizzate vengono espanse e che in Query Optimizer non viene presa in considerazione alcuna vista indicizzata per la sostituzione di una parte della query.Specifies that the indexed views are expanded and the query optimizer will not consider any indexed view as a substitute for any part of the query. Una vista viene espansa quando nel testo della query il nome della vista viene sostituito dalla definizione della vista stessa.A view is expanded when the view name is replaced by the view definition in the query text.

Con questo hint per la query viene praticamente disabilitato l'utilizzo diretto di viste indicizzate e di relativi indici nel piano di query.This query hint virtually disallows direct use of indexed views and indexes on indexed views in the query plan.

La vista indicizzata non viene espansa solo se nella sezione SELECT della query viene fatto riferimento diretto alla visualizzazione e se viene specificato WITH (NOEXPAND) o WITH (NOEXPAND, INDEX( index_value [ ,...n ] ) ).The indexed view is not expanded only if the view is directly referenced in the SELECT part of the query and WITH (NOEXPAND) or WITH (NOEXPAND, INDEX( index_value [ ,...n ] ) ) is specified. Per altre informazioni sull'hint per la query WITH (NOEXPAND), vedere FROM.For more information about the query hint WITH (NOEXPAND), see FROM.

L'hint influisce solo sulle viste nella sezione SELECT delle istruzioni, comprese le sezioni delle istruzioni INSERT, UPDATE, MERGE e DELETE.Only the views in the SELECT part of statements, including those in INSERT, UPDATE, MERGE, and DELETE statements are affected by the hint.

FAST number_rowsFAST number_rows
Specifica che la query è ottimizzata per il recupero rapido delle prime righe specificate in number_rows.Specifies that the query is optimized for fast retrieval of the first number_rows. Quest'ultimo è un numero intero non negativo.This is a nonnegative integer. Dopo la restituzione del primo numero di righe definito da number_rows, l'esecuzione della query continua e viene generato il set di risultati completo.After the first number_rows are returned, the query continues execution and produces its full result set.

FORCE ORDERFORCE ORDER
Specifica che l'ordine di join indicato dalla sintassi della query viene conservato durante l'ottimizzazione della query.Specifies that the join order indicated by the query syntax is preserved during query optimization. L'utilizzo dell'hint FORCE ORDER non ha alcun effetto sulla possibile inversione dei ruoli in Query Optimizer.Using FORCE ORDER does not affect possible role reversal behavior of the query optimizer.

Nota

In un'istruzione MERGE, l'accesso alla tabella di origine viene eseguito prima della tabella di destinazione come ordine di join predefinito, a meno che non sia specificata la clausola WHEN SOURCE NOT MATCHED.In a MERGE statement, the source table is accessed before the target table as the default join order, unless the WHEN SOURCE NOT MATCHED clause is specified. Specificando FORCE ORDER viene conservato questo comportamento predefinito.Specifying FORCE ORDER preserves this default behavior.

{ FORCE | DISABLE } EXTERNALPUSHDOWN{ FORCE | DISABLE } EXTERNALPUSHDOWN
Forzare o disabilitare il pushdown del calcolo delle espressioni di qualificazione in Hadoop.Force or disable the pushdown of the computation of qualifying expressions in Hadoop. Si applica solo alle query con PolyBase.Only applies to queries using PolyBase. Non esegue il pushdown nell'archiviazione di Azure.Will not push down to Azure storage.

KEEP PLANKEEP PLAN
Forza in Query Optimizer l'impostazione di una soglia di ricompilazione stimata meno restrittiva per una query.Forces the query optimizer to relax the estimated recompile threshold for a query. La soglia di ricompilazione stimata è il punto in corrispondenza del quale una query viene automaticamente ricompilata quando in una tabella è stato apportato il numero stabilito di modifiche a livello di colonne indicizzate mediante l'esecuzione delle istruzioni UPDATE, DELETE, MERGE o INSERT.The estimated recompile threshold is the point at which a query is automatically recompiled when the estimated number of indexed column changes have been made to a table by running UPDATE, DELETE, MERGE, or INSERT statements. Specificando KEEP PLAN è possibile assicurarsi che una query non venga ricompilata troppo frequentemente in caso di più aggiornamenti di una tabella.Specifying KEEP PLAN makes sure that a query will not be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
Impedisce a Query Optimizer di ricompilare una query in seguito a modifiche alle statistiche.Forces the query optimizer not to recompile a query due to changes in statistics. Se si specifica KEEPFIXED PLAN, assicurarsi che una query venga ricompilata solo se lo schema delle tabelle sottostanti viene modificato o se in tali tabelle si esegue sp_recompile.Specifying KEEPFIXED PLAN makes sure that a query will be recompiled only if the schema of the underlying tables is changed or if sp_recompile is executed against those tables.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEXIGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
Si applica a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

Impedisce alla query di usare un indice columnstore ottimizzato per la memoria non cluster.Prevents the query from using a nonclustered memory optimized columnstore index. Se la query contiene l'hint per la query per evitare l'utilizzo dell'indice columnstore e un hint per l'indice per utilizzare un indice columnstore, gli hint sono in conflitto e la query restituisce un errore.If the query contains the query hint to avoid use of the columnstore index and an index hint to use a columnstore index, the hints are in conflict and the query returns an error.

MAX_GRANT_PERCENT = percentMAX_GRANT_PERCENT = percent
Dimensioni della concessione di memoria massima in PERCENT.The maximum memory grant size in PERCENT. Nella query è garantito il non superamento di questo limite.The query is guaranteed not to exceed this limit. Il limite effettivo può essere inferiore se l'impostazione di Resource Governor è inferiore al limite.The actual limit can be lower if the resource governor setting is lower than this. I valori validi sono compresi tra 0,0 e 100,0.Valid values are between 0.0 and 100.0.

Si applica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

MIN_GRANT_PERCENT = percentMIN_GRANT_PERCENT = percent
Dimensioni della concessione di memoria minima in PERCENT = % del limite predefinito.The minimum memory grant size in PERCENT = % of default limit. Nella query è garantito il recupero del valore MAX(required memory, min grant) poiché è necessaria almeno la memoria richiesta per avviare una query.The query is guaranteed to get MAX(required memory, min grant) because at least required memory is needed to start a query. I valori validi sono compresi tra 0,0 e 100,0.Valid values are between 0.0 and 100.0.

Si applica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

MAXDOP numberMAXDOP number
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Esegue l'override dell'opzione di configurazione max degree of parallelism di sp_configure e Resource Governor per la query che specifica l'opzione.Overrides the max degree of parallelism configuration option of sp_configure and Resource Governor for the query specifying this option. L'hint per la query MAXDOP può superare il valore configurato con sp_configure.The MAXDOP query hint can exceed the value configured with sp_configure. Se MAXDOP supera il valore configurato con Resource Governor, il Motore di databaseDatabase Engine usa il valore MAXDOP di Resource Governor descritto in ALTER WORKLOAD GROUP (Transact-SQL).If MAXDOP exceeds the value configured with Resource Governor, the Motore di databaseDatabase Engine uses the Resource Governor MAXDOP value, described in ALTER WORKLOAD GROUP (Transact-SQL). Quando si usa l'hint per la query MAXDOP sono valide tutte le regole semantiche usate con l'opzione di configurazione max degree of parallelism.All semantic rules used with the max degree of parallelism configuration option are applicable when you use the MAXDOP query hint. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option.

Avviso

Se MAXDOP è impostato su zero, il server sceglie il grado massimo di parallelismo.If MAXDOP is set to zero, then the server chooses the max degree of parallelism.

MAXRECURSION number MAXRECURSION number
Specifica il numero massimo di ricorsioni consentito per questa query.Specifies the maximum number of recursions allowed for this query. number è un valore intero non negativo compreso tra 0 e 32,767.number is a nonnegative integer between 0 and 32,767. Se è specificato 0, non viene applicato alcun limite.When 0 is specified, no limit is applied. Se questa opzione non viene specificata, il limite predefinito per il server è 100.If this option is not specified, the default limit for the server is 100.

Se durante l'esecuzione della query viene raggiunto il valore specificato o predefinito per il limite MAXRECURSION, la query viene terminata e viene restituito un errore.When the specified or default number for MAXRECURSION limit is reached during query execution, the query is ended and an error is returned.

A causa di questo errore, verrà eseguito il rollback di tutti gli effetti dell'istruzione.Because of this error, all effects of the statement are rolled back. Se l'istruzione è un'istruzione SELECT, è possibile che vengano restituiti risultati parziali oppure nessun risultato.If the statement is a SELECT statement, partial results or no results may be returned. È possibile che eventuali risultati parziali non includano tutte le righe nei livelli di ricorsione che superano il livello di ricorsione massimo specificato.Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.

Per altre informazioni, vedere WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

NO_PERFORMANCE_SPOOLNO_PERFORMANCE_SPOOL
Si applica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

Impedisce l'aggiunta di un operatore spool ai piani di query (ad eccezione dei piani in cui spool è necessario per garantire una semantica di aggiornamento valida).Prevents a spool operator from being added to query plans (except for the plans when spool is required to guarantee valid update semantics). In alcuni scenari l'operatore spool può ridurre le prestazioni.In some scenarios, the spool operator may reduce performance. Ad esempio, poiché lo spool usa tempdb potrebbe verificarsi un conflitto di tempdb se sono presenti numerose query simultanee in esecuzione con le operazioni di spooling.For example, the spool uses tempdb and tempdb contention can occur if there are many concurrent queries running with the spool operations.

OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
Imposta Query Optimizer in modo che utilizzi un valore specifico per una variabile locale quando la query viene compilata e ottimizzata.Instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. Il valore viene utilizzato solo durante l'ottimizzazione della query e non durante l'esecuzione.The value is used only during query optimization, and not during query execution.

@variable_name
Nome di una variabile locale utilizzata in una query alla quale è possibile assegnare un valore da utilizzare con l'hint per la query OPTIMIZE FOR.Is the name of a local variable used in a query, to which a value may be assigned for use with the OPTIMIZE FOR query hint.

UNKNOWNUNKNOWN
Specifica che Query Optimizer usa dati statistici anziché il valore iniziale per determinare il valore per una variabile locale durante l'ottimizzazione della query.Specifies that the query optimizer uses statistical data instead of the initial value to determine the value for a local variable during query optimization.

literal_constantliteral_constant
Valore letterale costante a cui assegnare @variable_name per l'utilizzo con l'hint per la query OPTIMIZE FOR.Is a literal constant value to be assigned @variable_name for use with the OPTIMIZE FOR query hint. literal_constant viene usato solo durante l'ottimizzazione della query e non come valore di @variable_name durante l'esecuzione della query.literal_constant is used only during query optimization, and not as the value of @variable_name during query execution. literal_constant può essere di qualsiasi tipo di dati di sistema di SQL ServerSQL Server esprimibile come costante letterale.literal_constant can be of any SQL ServerSQL Server system data type that can be expressed as a literal constant. Il tipo di dati di literal_constant deve supportare la conversione implicita nel tipo di dati a cui @variable_name fa riferimento nella query.The data type of literal_constant must be implicitly convertible to the data type that @variable_name references in the query.

OPTIMIZE FOR può annullare la funzionalità di rilevamento predefinita dei parametri di Query Optimizer oppure può essere utilizzato durante la creazione delle guide di piano.OPTIMIZE FOR can counteract the default parameter detection behavior of the optimizer or can be used when you create plan guides. Per altre informazioni, vedere Ricompilare una stored procedure.For more information, see Recompile a Stored Procedure.

OPTIMIZE FOR UNKNOWNOPTIMIZE FOR UNKNOWN
Indica a Query Optimizer di utilizzare dati statistici anziché i valori iniziali per tutte le variabili locali quando la query viene compilata e ottimizzata, includendo parametri creati con parametrizzazione forzata.Instructs the query optimizer to use statistical data instead of the initial values for all local variables when the query is compiled and optimized, including parameters created with forced parameterization.

Se OPTIMIZE FOR @variable_name = literal_constant e OPTIMIZE FOR UNKNOWN sono usati nello stesso hint per la query, Query Optimizer userà il valore literal_constant indicato per un valore specifico e UNKNOWN per i valori di variabile rimanenti.If OPTIMIZE FOR @variable_name = literal_constant and OPTIMIZE FOR UNKNOWN are used in the same query hint, the query optimizer will use the literal_constant that is specified for a specific value and UNKNOWN for the remaining variable values. I valori vengono utilizzati durante l'ottimizzazione della query e non durante l'esecuzione di questa.The values are used only during query optimization, and not during query execution.

PARAMETERIZATION { SIMPLE | FORCED }PARAMETERIZATION { SIMPLE | FORCED }
Specifica le regole di parametrizzazione applicate da Query Optimizer di SQL ServerSQL Server alla query durante la compilazione di questa.Specifies the parameterization rules that the SQL ServerSQL Server query optimizer applies to the query when it is compiled.

Importante

È possibile specificare l'hint per la query PARAMETERIZATION all'interno di una guida di piano per sostituire l'impostazione corrente dell'opzione SET del database PARAMETERIZATIONThe PARAMETERIZATION query hint can only be specified inside a plan guide to override the current setting of the PARAMETERIZATION database SET option. e non direttamente all'interno di una query.It cannot be specified directly within a query.
Per altre informazioni, vedere Specificare il comportamento di parametrizzazione delle query tramite guide di piano.For more information, see Specify Query Parameterization Behavior by Using Plan Guides.

SIMPLE indica a Query Optimizer di tentare la parametrizzazione semplice.SIMPLE instructs the query optimizer to attempt simple parameterization. FORCED indica a Query Optimizer di tentare la parametrizzazione forzata.FORCED instructs the query optimizer to attempt forced parameterization. Per altre informazioni, vedere Parametrizzazione forzata in Guida sull'architettura di elaborazione delle query, e Parametrizzazione semplice in Guida sull'architettura di elaborazione delle query.For more information, see Forced Parameterization in the Query Processing Architecture Guide, and Simple Parameterization in the Query Processing Architecture Guide.

RECOMPILERECOMPILE
Indica a Motore di database di SQL ServerSQL Server Database Engine di eliminare il piano generato per la query dopo che questa è stata eseguita e forza Query Optimizer a ricompilare un piano di query alla successiva esecuzione della stessa query.Instructs the Motore di database di SQL ServerSQL Server Database Engine to discard the plan generated for the query after it executes, forcing the query optimizer to recompile a query plan the next time the same query is executed. Se RECOMPILE non viene specificato, i piani di query vengono inseriti nella cache e riutilizzati da Motore di databaseDatabase Engine.Without specifying RECOMPILE, the Motore di databaseDatabase Engine caches query plans and reuses them. Durante la compilazione dei piani di query, l'hint per la query RECOMPILE utilizza i valori correnti delle variabili locali incluse nella query e, se la query è contenuta in una stored procedure, i valori correnti vengono passati ai parametri.When compiling query plans, the RECOMPILE query hint uses the current values of any local variables in the query and, if the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE rappresenta una valida alternativa alla creazione di una stored procedure che utilizza la clausola WITH RECOMPILE quando è necessario ricompilare solo un subset di query all'interno della stored procedure, anziché l'intera stored procedure.RECOMPILE is a useful alternative to creating a stored procedure that uses the WITH RECOMPILE clause when only a subset of queries inside the stored procedure, instead of the whole stored procedure, must be recompiled. Per altre informazioni, vedere Ricompilare una stored procedure.For more information, see Recompile a Stored Procedure. RECOMPILE risulta utile anche durante la creazione delle guide di piano.RECOMPILE is also useful when you create plan guides.

ROBUST PLANROBUST PLAN
Impone in Query Optimizer l'applicazione di un piano che funziona anche con dimensioni di riga massime, eventualmente a scapito delle prestazioni.Forces the query optimizer to try a plan that works for the maximum potential row size, possibly at the expense of performance. Quando la query viene elaborata, è possibile che tabelle e operatori intermedi debbano archiviare ed elaborare righe con dimensioni maggiori rispetto a qualsiasi riga di input.When the query is processed, intermediate tables and operators may have to store and process rows that are wider than any one of the input rows. Talvolta le righe possono essere talmente estese che l'operatore specificato non è in grado di elaborarle.The rows may be so wide that, sometimes, the particular operator cannot process the row. In questi casi, Motore di databaseDatabase Engine genera un errore durante l'esecuzione della query.If this occurs, the Motore di databaseDatabase Engine produces an error during query execution. Grazie alla clausola ROBUST PLAN, i piani di query in cui potrebbe verificarsi questo problema vengono ignorati da Query Optimizer.By using ROBUST PLAN, you instruct the query optimizer not to consider any query plans that may encounter this problem.

Se non è possibile implementare tale piano, viene restituito un errore anziché posticipare il rilevamento dell'errore fino all'esecuzione della query.If such a plan is not possible, the query optimizer returns an error instead of deferring error detection to query execution. Le righe possono includere colonne di lunghezza variabile. In Motore di databaseDatabase Engine è consentito definire righe con dimensioni massime superiori alla capacità di elaborazione di Motore di databaseDatabase Engine.Rows may contain variable-length columns; the Motore di databaseDatabase Engine allows for rows to be defined that have a maximum potential size beyond the ability of the Motore di databaseDatabase Engine to process them. In un'applicazione tuttavia vengono in genere archiviate righe le cui dimensioni effettive rientrano nei limiti della capacità di elaborazione di Motore di databaseDatabase Engine.Generally, despite the maximum potential size, an application stores rows that have actual sizes within the limits that the Motore di databaseDatabase Engine can process. Se in Motore di databaseDatabase Engine viene rilevata una riga di lunghezza eccessiva, viene restituito un errore di esecuzione.If the Motore di databaseDatabase Engine encounters a row that is too long, an execution error is returned.

USE HINT ( 'hint_name' )USE HINT ( 'hint_name' )
Si applica a: SQL ServerSQL Server (a partire da SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) e Database SQLSQL Database.Applies to: Applies to SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) and Database SQLSQL Database.

Specifica uno o più hint aggiuntivi nel processore di query come specificato da un nome di hint all'interno di virgolette singole.Provides one or more additional hints to the query processor as specified by a hint name inside single quotation marks.

Sono supportati i nomi di hint seguenti:The following hint names are supported:

  • 'DISABLE_OPTIMIZED_NESTED_LOOP''DISABLE_OPTIMIZED_NESTED_LOOP'
    Indica a Query Processor di non usare un'operazione di ordinamento (ordinamento batch) per i join a cicli annidati ottimizzati durante la generazione di un piano.Instructs the query processor not to use a sort operation (batch sort) for optimized nested loop joins when generating a query plan. Equivale al flag di traccia 2340.This is equivalent to trace flag 2340.
  • 'FORCE_LEGACY_CARDINALITY_ESTIMATION''FORCE_LEGACY_CARDINALITY_ESTIMATION'
    Forza in Query Optimizer l'utilizzo del modello di stima della cardinalità di SQL Server 2012 (11.x)SQL Server 2012 (11.x) e versioni precedenti.Forces the query optimizer to use Cardinality Estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions. Equivale al flag di traccia 9481 o all'impostazione Configurazione con ambito database LEGACY_CARDINALITY_ESTIMATION=ON.This is equivalent to trace flag 9481 or Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON.
  • 'ENABLE_QUERY_OPTIMIZER_HOTFIXES''ENABLE_QUERY_OPTIMIZER_HOTFIXES'
    Abilita gli hotfix di Query Optimizer (modifiche rilasciate negli aggiornamenti cumulativi e nei Service Pack di SQL Server).Enables query optimizer hotfixes (changes released in SQL Server Cumulative Updates and Service Packs). Equivale al flag di traccia 4199 o all'impostazione Configurazione con ambito database QUERY_OPTIMIZER_HOTFIXES=ON.This is equivalent to trace flag 4199 or Database Scoped Configuration setting QUERY_OPTIMIZER_HOTFIXES=ON.
  • 'DISABLE_PARAMETER_SNIFFING''DISABLE_PARAMETER_SNIFFING'
    Indica a Query Optimizer di usare una distribuzione dei dati media durante la compilazione di una query con uno o più parametri, rendendo il piano di query indipendente dal valore del parametro usato per la prima volta durante la compilazione della query.Instructs query optimizer to use average data distribution while compiling a query with one or more parameters, making the query plan independent on the parameter value which was first used when the query was compiled. Equivale al flag di traccia 4136 o all'impostazione Configurazione con ambito database PARAMETER_SNIFFING=OFF.This is equivalent to trace flag 4136 or Database Scoped Configuration setting PARAMETER_SNIFFING=OFF.
  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES''ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    Fa in modo che SQL Server generi un piano che usa la selettività minima durante la stima dei predicati AND per i filtri per tenere conto della correlazione.Causes SQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation. Equivale al flag di traccia 4137 usato con il modello di stima della cardinalità di SQL Server 2012 (11.x)SQL Server 2012 (11.x) e versioni precedenti e ha un effetto simile al flag di traccia 9471 usato con il modello di stima della cardinalità di SQL Server 2014 (12.x)SQL Server 2014 (12.x) o versioni successive.This is equivalent to trace flag 4137 when used with cardinality estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions, and has similar effect when trace flag 9471 is used with cardinality estimation model of SQL Server 2014 (12.x)SQL Server 2014 (12.x) or higher.
  • 'DISABLE_OPTIMIZER_ROWGOAL''DISABLE_OPTIMIZER_ROWGOAL'
    Fa in modo che SQL Server generi un piano in cui non vengono usate le rettifiche degli obiettivi di riga con query contenenti le parole chiave TOP, OPTION (FAST N), IN o EXISTS.Causes SQL Server to generate a plan that does not use row goal adjustments with queries that contain TOP, OPTION (FAST N), IN, or EXISTS keywords. Equivale al flag di traccia 4138.This is equivalent to trace flag 4138.
  • 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS''ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
    Abilita le statistiche rapide generate automaticamente (modifica istogramma) per qualsiasi colonna di indice iniziale per cui è necessaria la stima della cardinalità.Enables automatically generated quick statistics (histogram amendment) for any leading index column for which cardinality estimation is needed. L'istogramma usato per la stima della cardinalità viene modificato durante la compilazione della query per tenere conto del valore massimo o minimo effettivo di questa colonna.The histogram used to estimate cardinality will be adjusted at query compile time to account for actual maximum or minimum value of this column. Equivale al flag di traccia 4139.This is equivalent to trace flag 4139.
  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS''ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
    Fa in modo che SQL ServerSQL Server generi un piano di query che usi il presupposto di indipendenza semplice anziché il presupposto predefinito di indipendenza di base per i join, nel modello di stima della cardinalità di Query Optimizer in SQL Server 2014 (12.x)SQL Server 2014 (12.x) o versione successiva.Causes SQL ServerSQL Server to generate a query plan using the Simple Containment assumption instead of the default Base Containment assumption for joins, under the query optimizer Cardinality Estimation model of SQL Server 2014 (12.x)SQL Server 2014 (12.x) or newer. Equivale al flag di traccia 9476.This is equivalent to trace flag 9476.
  • 'FORCE_DEFAULT_CARDINALITY_ESTIMATION''FORCE_DEFAULT_CARDINALITY_ESTIMATION'
    Forza in Query Optimizer l'utilizzo del modello di stima della cardinalità che corrisponde al livello di compatibilità del database corrente.Forces the Query Optimizer to use Cardinality Estimation model that corresponds to the current database compatibility level. Usare questo hint per eseguire l'override dell'impostazione Configurazione con ambito database LEGACY_CARDINALITY_ESTIMATION=ON o il flag di traccia 9481.Use this hint to override Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON or trace flag 9481.
  • 'DISABLE_INTERLEAVED_EXECUTION_TVF''DISABLE_INTERLEAVED_EXECUTION_TVF'
    Disabilita l'esecuzione interleaved per funzioni con valori di tabella a più istruzioni.Disables interleaved execution for multi-statement table valued functions. Per altre informazioni, vedere Esecuzione interleaved per funzioni con valori di tabella a più istruzioni.For more information, see Interleaved execution for multi-statement table valued functions.
  • 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
    Disabilita il feedback delle concessioni di memoria in modalità batch.Disables batch mode memory grant feedback. Per altre informazioni, vedere Feedback delle concessioni di memoria in modalità batch.For more information, see Batch mode memory grant feedback.
  • 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS''DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
    Disabilita i join adattivi in modalità batch.Disables batch mode adaptive joins. Per altre informazioni, vedere Join adattivi in modalità batch.For more information, see Batch mode Adaptive Joins .

Suggerimento

Per i nomi degli hint non viene fatta distinzione tra maiuscole e minuscole.Hint names are case-insensitive.

È possibile eseguire una query nell'elenco di tutti i nomi USE HINT supportati usando la DMV sys.dm_exec_valid_use_hints .The list of all supported USE HINT names can be queried using the dynamic management view sys.dm_exec_valid_use_hints.

Importante

Alcuni hint USE HINT possono essere in conflitto con i flag di traccia abilitati a livello globale o sessione o con le impostazioni di configurazione con ambito database.Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings. In questo caso, l'hint del livello di query (USE HINT) ha sempre la precedenza.In this case, the query level hint (USE HINT) always takes precedence. Se un hint USE HINT è in conflitto con un altro hint per la query o un flag di traccia abilitato a livello di query (ad esempio tramite QUERYTRACEON), SQL ServerSQL Server genera un errore quando si tenta di eseguire la query.If a USE HINT conflicts with another query hint, or a trace flag enabled at the query level (such as by QUERYTRACEON), SQL ServerSQL Server will generate an error when trying to execute the query.

USE PLAN N 'xml_plan' USE PLAN N 'xml_plan'
Forza in Query Optimizer l'utilizzo di un piano di query esistente per una query specificata da 'xml_plan'.Forces the query optimizer to use an existing query plan for a query that is specified by 'xml_plan'. USE PLAN non può essere specificato nelle istruzioni INSERT, UPDATE, MERGE o DELETE.USE PLAN cannot be specified with INSERT, UPDATE, MERGE, or DELETE statements.

TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] ) Applica l'hint di tabella specificato alla tabella o alla visualizzazione che corrisponde a exposed_object_name.TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] ) Applies the specified table hint to the table or view that corresponds to exposed_object_name. È consigliabile usare un hint di tabella come hint per la query solo nel contesto di una guida di piano.We recommend using a table hint as a query hint only in the context of a plan guide.

exposed_object_name può essere uno dei seguenti riferimenti:exposed_object_name can be one of the following references:

  • Quando viene usato un alias per la tabella o la visualizzazione nella clausola FROM della query, exposed_object_name è l'alias.When an alias is used for the table or view in the FROM clause of the query, exposed_object_name is the alias.

  • Quando non viene usato un alias, exposed_object_name è la corrispondenza esatta della tabella o della visualizzazione cui viene fatto riferimento nella clausola FROM.When an alias is not used, exposed_object_name is the exact match of the table or view referenced in the FROM clause. Ad esempio, se viene fatto riferimento alla tabella o alla visualizzazione usando un nome in due parti, exposed_object_name è lo stesso nome in due parti.For example, if the table or view is referenced using a two-part name, exposed_object_name is the same two-part name.

    Quando viene specificato exposed_object_name senza specificare anche un hint di tabella, qualsiasi indice specificato nella query come parte di un hint di tabella per l'oggetto viene ignorato e l'utilizzo di indici è determinato da Query Optimizer.When exposed_object_name is specified without also specifying a table hint, any indexes specified in the query as part of a table hint for the object are disregarded and index usage is determined by the query optimizer. È possibile utilizzare questa tecnica per eliminare l'effetto di un hint di tabella INDEX quando non è possibile modificare la query originale.You can use this technique to eliminate the effect of an INDEX table hint when you cannot modify the original query. Vedere l'esempio J.See Example J.

<table_hint> ::= { [ NOEXPAND ] { INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value ) | FORCESEEK [(index_value(index_column_name [,... ] )) ]| FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | SNAPSHOT | SPATIAL_WINDOW_MAX_CELLS | TABLOCK | TABLOCKX | UPDLOCK | XLOCK } È l'hint di tabella da applicare alla tabella o alla visualizzazione che corrisponde aexposed_object_name come hint per la query.<table_hint> ::= { [ NOEXPAND ] { INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value ) | FORCESEEK [(index_value(index_column_name [,... ] )) ]| FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | SNAPSHOT | SPATIAL_WINDOW_MAX_CELLS | TABLOCK | TABLOCKX | UPDLOCK | XLOCK } Is the table hint to apply to the table or view that corresponds to exposed_object_name as a query hint. Per una descrizione di questi hint, vedere Hint di tabella (Transact-SQL).For a description of these hints, see Table Hints (Transact-SQL).

Gli hint di tabella diversi da INDEX, FORCESCAN e FORCESEEK non sono consentiti come hint per la query, a meno che la query non disponga già di una clausola WITH che specifica l'hint di tabella.Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. Per altre informazioni, vedere la sezione Osservazioni.For more information, see Remarks.

Attenzione

Se si specifica FORCESEEK con parametri, il numero di piani che possono essere considerati da Query Optimizer viene limitato più di quanto avvenga se si specifica FORCESEEK senza parametri.Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. In questo caso potrebbe venire generato un errore "Impossibile generare il piano" con maggiore frequenza.This may cause a "Plan cannot be generated" error to occur in more cases. In una versione futura, le modifiche interne a Query Optimizer potrebbero consentire di prendere in considerazione più piani.In a future release, internal modifications to the optimizer may allow more plans to be considered.

RemarksRemarks

Gli hint per la query non possono essere specificati in un'istruzione INSERT, eccetto quando viene usata una clausola SELECT all'interno dell'istruzione.Query hints cannot be specified in an INSERT statement, except when a SELECT clause is used inside the statement.

È possibile specificare gli hint per la query solo nella query di livello principale e non nelle sottoquery.Query hints can be specified only in the top-level query, not in subqueries. Quando un hint di tabella viene specificato come hint per la query, l'hint può essere specificato nella query di livello superiore o in una sottoquery, tuttavia il valore specificato per exposed_object_name nella clausola TABLE HINT deve corrispondere esattamente al nome esposto nella query o nella sottoquery.When a table hint is specified as a query hint, the hint can be specified in the top-level query or in a subquery; however, the value specified for exposed_object_name in the TABLE HINT clause must match exactly the exposed name in the query or subquery.

Specifica di hint di tabella come hint per la querySpecifying Table Hints as Query Hints

È consigliabile usare l'hint di tabella INDEX, FORCESCAN o FORCESEEK come hint per la query solo nel contesto di una guida di piano.We recommend using the INDEX, FORCESCAN, or FORCESEEK table hint as a query hint only in the context of a plan guide. Le guide di piano sono utili quando non è possibile modificare la query originale, ad esempio perché si tratta di un'applicazione di terze parti.Plan guides are useful when you cannot modify the original query, for example, because it is a third-party application. L'hint per la query specificato nella guida di piano viene aggiunto alla query prima della compilazione e dell'ottimizzazione.The query hint specified in the plan guide is added to the query before it is compiled and optimized. Per le query ad hoc, utilizzare la clausola TABLE HINT solo quando si testano istruzioni della guida di piano.For ad-hoc queries, use the TABLE HINT clause only when testing plan guide statements. Per tutte le altre query ad hoc, è consigliabile specificare tali hint solo come hint di tabella.For all other ad-hoc queries, we recommend specifying these hints only as table hints.

Se specificati come hint per la query, gli hint di tabella INDEX, FORCESCAN e FORCESEEK sono validi per gli oggetti seguenti:When specified as a query hint, the INDEX, FORCESCAN, and FORCESEEK table hints are valid for the following objects:

  • TabelleTables
  • VisteViews
  • Viste indicizzateIndexed views
  • Espressioni di tabella comuni (l'hint deve essere specificato nell'istruzione SELECT il cui set di risultati popola l'espressione di tabella comune)Common table expressions (the hint must be specified in the SELECT statement whose result set populates the common table expression)
  • DMVDynamic management views
  • Sottoquery denominateNamed subqueries

Gli hint di tabella INDEX, FORCESCAN e FORCESEEK possono essere specificati come hint per la query senza hint di tabella esistenti oppure possono essere utilizzati per sostituire uno o più hint INDEX, FORCESCAN o FORCESEEK esistenti nella query.The INDEX, FORCESCAN, and FORCESEEK table hints can be specified as query hints for a query that does not have any existing table hints, or they can be used to replace existing INDEX, FORCESCAN or FORCESEEK hints in the query, respectively. Gli hint di tabella diversi da INDEX, FORCESCAN e FORCESEEK non sono consentiti come hint per la query, a meno che la query non disponga già di una clausola WITH che specifica l'hint di tabella.Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. In questo caso è necessario specificare inoltre un hint corrispondente come un hint per la query utilizzando TABLE HINT nella clausola OPTION per mantenere la semantica della query.In this case, a matching hint must also be specified as a query hint by using TABLE HINT in the OPTION clause to preserve the semantics of the query. Ad esempio, se la query contiene l'hint di tabella NOLOCK, la clausola OPTION nel parametro @hints della guida di piano deve contenere anch'essa l'hint NOLOCK.For example, if the query contains the table hint NOLOCK, the OPTION clause in the @hints parameter of the plan guide must also contain the NOLOCK hint. Vedere l'esempio K. Quando un hint di tabella diverso da INDEX, FORCESCAN o FORCESEEK viene specificato utilizzando TABLE HINT nella clausola OPTION senza un hint per la query corrispondente, o viceversa, viene generato l'errore 8702, che indica che la clausola OPTION può comportare la modifica della semantica della query, e la query ha esito negativo.See Example K. When a table hint other than INDEX, FORCESCAN, or FORCESEEK is specified by using TABLE HINT in the OPTION clause without a matching query hint, or vice versa; error 8702 is raised (indicating that the OPTION clause can cause the semantics of the query to change) and the query fails.

EsempiExamples

A.A. Utilizzo di MERGE JOINUsing MERGE JOIN

L'esempio seguente specifica che l'operazione JOIN nella query viene eseguita da MERGE JOIN.The following example specifies that the JOIN operation in the query is performed by MERGE JOIN. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT *   
FROM Sales.Customer AS c  
INNER JOIN Sales.CustomerAddress AS ca ON c.CustomerID = ca.CustomerID  
WHERE TerritoryID = 5  
OPTION (MERGE JOIN);  
GO    

B.B. Utilizzo di OPTIMIZE FORUsing OPTIMIZE FOR

L'esempio seguente indica a Query Optimizer di usare il valore 'Seattle' per la variabile locale @city_name e di usare dati statistici per determinare il valore per la variabile locale @postal_code durante l'ottimizzazione della query.The following example instructs the query optimizer to use the value 'Seattle' for local variable @city_name and to use statistical data to determine the value for the local variable @postal_code when optimizing the query. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

DECLARE @city_name nvarchar(30);  
DECLARE @postal_code nvarchar(15);  
SET @city_name = 'Ascheim';  
SET @postal_code = 86171;  
SELECT * FROM Person.Address  
WHERE City = @city_name AND PostalCode = @postal_code  
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );  
GO  

C.C. Utilizzo di MAXRECURSIONUsing MAXRECURSION

È possibile utilizzare MAXRECURSION per evitare che un'espressione di tabella comune (CTE) ricorsiva non corretta provochi un ciclo infinito.MAXRECURSION can be used to prevent a poorly formed recursive common table expression from entering into an infinite loop. L'esempio seguente crea intenzionalmente un ciclo infinito e usa l'hint MAXRECURSION per limitare a due il numero di livelli di ricorsione.The following example intentionally creates an infinite loop and uses the MAXRECURSION hint to limit the number of recursion levels to two. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

--Creates an infinite loop  
WITH cte (CustomerID, PersonID, StoreID) AS  
(  
    SELECT CustomerID, PersonID, StoreID  
    FROM Sales.Customer  
    WHERE PersonID IS NOT NULL  
  UNION ALL  
    SELECT cte.CustomerID, cte.PersonID, cte.StoreID  
    FROM cte   
    JOIN  Sales.Customer AS e   
        ON cte.PersonID = e.CustomerID  
)  
--Uses MAXRECURSION to limit the recursive levels to 2  
SELECT CustomerID, PersonID, StoreID  
FROM cte  
OPTION (MAXRECURSION 2);  
GO  

Dopo la correzione dell'errore del codice, MAXRECURSION non è più necessario.After the coding error is corrected, MAXRECURSION is no longer required.

D.D. Utilizzo di MERGE UNIONUsing MERGE UNION

L'esempio seguente usa l'hint per la query MERGE UNION.The following example uses the MERGE UNION query hint. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT *  
FROM HumanResources.Employee AS e1  
UNION  
SELECT *  
FROM HumanResources.Employee AS e2  
OPTION (MERGE UNION);  
GO  

E.E. Utilizzo di HASH GROUP e FASTUsing HASH GROUP and FAST

L'esempio seguente usa gli hint per la query HASH GROUP e FAST.The following example uses the HASH GROUP and FAST query hints. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (HASH GROUP, FAST 10);  
GO    

F.F. Utilizzo di MAXDOPUsing MAXDOP

L'esempio seguente usa l'hint per la query MAXDOP.The following example uses the MAXDOP query hint. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (MAXDOP 2);    
GO

G.G. Utilizzo di INDEXUsing INDEX

Nell'esempio seguente viene utilizzato l'hint INDEX.The following examples use the INDEX hint. Nel primo esempio viene specificato un singolo indice.The first example specifies a single index. Nel secondo esempio vengono specificati più indici per un singolo riferimento alla tabella.The second example specifies multiple indexes for a single table reference. In entrambi gli esempi, dal momento che l'hint INDEX è applicato a una tabella che utilizza un alias, anche la clausola TABLE HINT deve specificare lo stesso alias del nome dell'oggetto esposto.In both examples, because the INDEX hint is applied on a table that uses an alias, the TABLE HINT clause must also specify the same alias as the exposed object name. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide1',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 2;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';  
GO  
EXEC sp_create_plan_guide   
    @name = N'Guide2',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 2;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';  
GO    

H.H. Utilizzo di FORCESEEKUsing FORCESEEK

Nell'esempio seguente viene utilizzato l'hint di tabella FORCESEEK.The following example uses the FORCESEEK table hint. Dal momento che l'hint INDEX è applicato a una tabella che utilizza un nome in due parti, anche la clausola TABLE HINT deve specificare lo stesso nome in due parti del nome dell'oggetto esposto.Because the INDEX hint is applied on a table that uses a two-part name, the TABLE HINT clause must also specify the same two-part name as the exposed object name. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide3',   
    @stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.Title  
              FROM HumanResources.Employee  
              JOIN Person.Contact AS c ON HumanResources.Employee.ContactID = c.ContactID  
              WHERE HumanResources.Employee.ManagerID = 3  
              ORDER BY c.LastName, c.FirstName;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';  
GO    

I.I. Utilizzo di più hint di tabellaUsing multiple table hints

Nell'esempio seguente vengono applicati l'hint INDEX a una tabella e l'hint FORCESEEK a un'altra.The following example applies the INDEX hint to one table and the FORCESEEK hint to another. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide4',   
    @stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 3;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT (e, INDEX( IX_Employee_ManagerID))   
                       , TABLE HINT (c, FORCESEEK))';  
GO  

J.J. Utilizzo di TABLE HINT per eseguire l'override di un hint di tabella esistenteUsing TABLE HINT to override an existing table hint

Nell'esempio seguente viene illustrato come utilizzare l'hint TABLE HINT senza specificare un hint per eseguire l'override del comportamento dell'hint di tabella INDEX specificato nella clausola FROM della query.The following example shows how to use the TABLE HINT hint without specifying a hint to override the behavior of the INDEX table hint specified in the FROM clause of the query. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide5',   
    @stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_ManagerID))  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 3;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT(e))';  
GO    

K.K. Specifica di hint di tabella che influiscono sulla semanticaSpecifying semantics-affecting table hints

Nell'esempio seguente sono contenuti due hint di tabella nella query: NOLOCK, che influisce sulla semantica, e INDEX, che non influisce sulla semantica.The following example contains two table hints in the query: NOLOCK, which is semantic-affecting, and INDEX, which is non-semantic-affecting. Per mantenere la semantica della query l’hint NOLOCK viene specificato nella clausola OPTIONS della guida di piano.To preserve the semantics of the query, the NOLOCK hint is specified in the OPTIONS clause of the plan guide. Oltre all'hint NOLOCK, vengono specificati gli hint INDEX e FORCESEEK che sostituiscono l'hint INDEX che non influisce sulla semantica nella query quando l'istruzione viene compilata e ottimizzata.In addition to the NOLOCK hint, the INDEX and FORCESEEK hints are specified and replace the non-semantic-affecting INDEX hint in the query when the statement is compiled and optimized. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide6',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 3;',  
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';  
GO    

Nell'esempio seguente viene illustrato un metodo alternativo per mantenere la semantica della query e consentire a Query Optimizer di scegliere un indice diverso da quello specificato nell'hint di tabella.The following example shows an alternative method to preserving the semantics of the query and allowing the optimizer to choose an index other than the index specified in the table hint. A tale scopo occorre specificare l'hint NOLOCK nella clausola OPTIONS (poiché influisce sulla semantica) e la parola chiave TABLE HINT con solo un riferimento alla tabella e nessun hint INDEX.This is done by specifying the NOLOCK hint in the OPTIONS clause (because it is semantic-affecting) and specifying the TABLE HINT keyword with only a table reference and no INDEX hint. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide7',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 2;',  
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT (e, NOLOCK))';  
GO  

L.L. Uso di USE HINTUsing USE HINT

L'esempio seguente usa gli hint per la query RECOMPILE e USE HINT.The following example uses the RECOMPILE and USE HINT query hints. Nell'esempio viene utilizzato il database AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

Si applica a: Database SQL di AzureAzure SQL Database, SQL Server 2016 (13.x)SQL Server 2016 (13.x).Applies to: Database SQL di AzureAzure SQL Database, SQL Server 2016 (13.x)SQL Server 2016 (13.x).

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING')); 
GO  

Vedere ancheSee Also

Hint (Transact-SQL) Hints (Transact-SQL)
sp_create_plan_guide (Transact-SQL) sp_create_plan_guide (Transact-SQL)
sp_control_plan_guide (Transact-SQL)sp_control_plan_guide (Transact-SQL)
Flag di tracciaTrace Flags