Dicas (Transact-SQL) – consultaHints (Transact-SQL) - Query

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

As dicas de consulta especificam que as dicas indicadas devem ser usadas em toda a consulta.Query hints specify that the indicated hints should be used throughout the query. Elas afetam todos os operadores na instrução.They affect all operators in the statement. Se UNION estiver envolvida na consulta principal, só a última consulta envolvendo uma operação UNION poderá ter a cláusula OPTION.If UNION is involved in the main query, only the last query involving a UNION operation can have the OPTION clause. As dicas de consulta são especificadas como parte da cláusula OPTION.Query hints are specified as part of the OPTION clause. O Erro 8622 ocorrerá se uma ou mais dicas de consulta fizerem com que o otimizador de consulta não gere um plano válido.Error 8622 occurs if one or more query hints cause the query optimizer not to generate a valid plan.

Cuidado

Como o otimizador de consulta do SQL ServerSQL Server seleciona, normalmente, o melhor plano de execução para uma consulta, recomendamos usar dicas apenas como último recurso para desenvolvedores e administradores de banco de dados experientes.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.

Aplica-se a:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

SintaxeSyntax

<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  
}  

ArgumentosArguments

{ HASH | ORDER } GROUP{ HASH | ORDER } GROUP
Especifica que as agregações que a cláusula GROUP BY ou DISTINCT da consulta descreve devem usar hash ou ordenação.Specifies that aggregations that the query's GROUP BY or DISTINCT clause describes should use hashing or ordering.

{ MERGE | HASH | CONCAT } UNION{ MERGE | HASH | CONCAT } UNION
Especifica que todas as operações UNION são executadas por mesclagem, hash ou concatenação de conjuntos de UNION.Specifies that all UNION operations are run by merging, hashing, or concatenating UNION sets. Se mais de uma dica de UNION for especificada, o otimizador de consulta selecionará a estratégia menos cara dentre as dicas especificadas.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
Especifica que todas as operações de junção são executadas por LOOP JOIN, MERGE JOIN ou HASH JOIN na consulta inteira.Specifies all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. Se você especificar mais de uma dica de junção, o otimizador selecionará a estratégia de junção menos cara dentre as permitidas.If you specify more than one join hint, the optimizer selects the least expensive join strategy from the allowed ones.

Se você especificar uma dica de junção na cláusula FROM da mesma consulta para um par de tabelas específico, essa dica de junção terá precedência na junção das duas tabelas.If you specify a join hint in the same query's FROM clause for a specific table pair, this join hint takes precedence in the joining of the two tables. As dicas de consulta, no entanto, ainda devem ser respeitadas.The query hints, though, must still be honored. A dica de junção para o par de tabelas pode restringir apenas a seleção dos métodos de junção permitidos na dica de consulta.The join hint for the pair of tables may only restrict the selection of allowed join methods in the query hint. Para obter mais informações, consulte Dicas de junção (Transact-SQL).For more information, see Join Hints (Transact-SQL).

EXPAND VIEWSEXPAND VIEWS
Especifica que as exibições indexadas são expandidas.Specifies the indexed views are expanded. Também especifica que o otimizador de consulta não considera qualquer exibição indexada como uma substituição de qualquer bloco da consulta.Also specifies the query optimizer won't consider any indexed view as a replacement for any query part. Uma exibição é expandida quando sua definição substitui o seu nome no texto da consulta.A view is expanded when the view definition replaces the view name in the query text.

Esta dica de consulta desabilita o uso direto de exibições indexadas e índices em exibições indexadas no plano de consulta.This query hint virtually disallows direct use of indexed views and indexes on indexed views in the query plan.

A exibição indexada permanecerá condensada se houver uma referência direta à exibição no bloco SELECT da consulta.The indexed view remains condensed if there's a direct reference to the view in the query's SELECT part. A exibição também permanecerá condensada se você especificar WITH (NOEXPAND) ou WITH (NOEXPAND, INDEX(index_value_ [ , ...n ] ) ).The view also remains condensed if you specify WITH (NOEXPAND) or WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) ). Para obter mais informações sobre a dica de consulta NOEXPAND, confira Usando NOEXPAND.For more information about the query hint NOEXPAND, see Using NOEXPAND.

A dica afetará apenas as exibições no bloco SELECT das instruções, incluindo as exibições nas instruções INSERT, UPDATE, MERGE e DELETE.The hint only affects the views in the statements' SELECT part, including those views in INSERT, UPDATE, MERGE, and DELETE statements.

FAST number_rowsFAST number_rows
Especifica que a consulta é otimizada para recuperação rápida das primeiras number_rows.Specifies that the query is optimized for fast retrieval of the first number_rows. Esse resultado é um inteiro não negativo.This result is a nonnegative integer. Depois que as primeiras number_rows são retornadas, a consulta continua a execução e produz seu conjunto de resultados completo.After the first number_rows are returned, the query continues execution and produces its full result set.

FORCE ORDERFORCE ORDER
Especifica que a ordem de junção indicada pela sintaxe de consulta é preservada durante a otimização da consulta.Specifies that the join order indicated by the query syntax is preserved during query optimization. Usar FORCE ORDER não afeta o possível comportamento de reversão de função do otimizador de consulta.Using FORCE ORDER doesn't affect possible role reversal behavior of the query optimizer.

Observação

Em uma instrução MERGE, a tabela de origem é acessada antes da tabela de destino como a ordem de junção padrão, a menos que a cláusula WHEN SOURCE NOT MATCHED seja especificada.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. Especificar FORCE ORDER preserva esse comportamento padrão.Specifying FORCE ORDER preserves this default behavior.

{ FORCE | DISABLE } EXTERNALPUSHDOWN{ FORCE | DISABLE } EXTERNALPUSHDOWN
Forçar ou desabilitar o pushdown da computação de expressões qualificadas no Hadoop.Force or disable the pushdown of the computation of qualifying expressions in Hadoop. Aplica-se somente a consultas que usam PolyBase.Only applies to queries using PolyBase. Não se aplicará ao armazenamento do Azure.Won't push down to Azure storage.

KEEP PLANKEEP PLAN
Força o otimizador de consulta a relaxar o limite de recompilação estimado para uma consulta.Forces the query optimizer to relax the estimated recompile threshold for a query. O limite de recompilação estimado inicia uma recompilação automática para a consulta quando o número estimado de alterações na coluna indexada é feito em uma tabela com a execução de uma das seguintes instruções:The estimated recompile threshold starts an automatic recompile for the query when the estimated number of indexed column changes have been made to a table by running one of the following statements:

  • UPDATEUPDATE
  • Delete (excluir)DELETE
  • MERGEMERGE
  • INSERTINSERT

Especificar KEEP PLAN assegura que uma consulta não seja recompilada tão frequentemente como quando há várias atualizações em uma tabela.Specifying KEEP PLAN makes sure a query won't be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
Força o otimizador de consulta a não recompilar uma consulta devido às alterações nas estatísticas.Forces the query optimizer not to recompile a query because of changes in statistics. Especificar KEEPFIXED PLAN garantirá que uma consulta seja recompilada apenas se o esquema das tabelas subjacentes for alterado ou se sp_recompile for executado nessas tabelas.Specifying KEEPFIXED PLAN makes sure that a query recompiles only if the schema of the underlying tables changes or if sp_recompile runs against those tables.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEXIGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
Aplica-se a: do SQL Server 2012 (11.x)SQL Server 2012 (11.x) ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

Impede a consulta de usar um índice columnstore otimizado para memória não clusterizado.Prevents the query from using a nonclustered memory optimized columnstore index. Se a consulta contiver a dica de consulta para evitar o uso do índice columnstore e uma dica de índice para usar um índice columnstore, as dicas entrarão em conflito e a consulta retornará um erro.If the query contains the query hint to avoid the 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
O tamanho máximo de concessão de memória em PERCENT.The maximum memory grant size in PERCENT. É garantido que a consulta não excederá esse limite.The query is guaranteed not to exceed this limit. O limite real poderá ser inferior se a configuração do Resource Governor for mais baixa que o valor especificado por esta dica.The actual limit can be lower if the Resource Governor setting is lower than the value specified by this hint. Os valores válidos estão entre 0,0 e 100,0.Valid values are between 0.0 and 100.0.

Aplica-se a: do SQL Server 2016 (13.x)SQL Server 2016 (13.x) ao 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
Tamanho mínimo de concessão de memória em PERCENT = % do limite padrão.The minimum memory grant size in PERCENT = % of default limit. É garantido que a consulta obtenha o MAX (memória necessária, mínima concedida) porque é preciso pelo menos a memória necessária para iniciar uma consulta.The query is guaranteed to get MAX(required memory, min grant) because at least required memory is needed to start a query. Os valores válidos estão entre 0,0 e 100,0.Valid values are between 0.0 and 100.0.

Aplica-se a: do SQL Server 2016 (13.x)SQL Server 2016 (13.x) ao 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
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Substitui a opção de configuração de grau máximo de paralelismo de sp_configure.Overrides the max degree of parallelism configuration option of sp_configure. Também substitui o Resource Governor para a consulta que especifica essa opção.Also overrides the Resource Governor for the query specifying this option. A dica de consulta MAXDOP pode exceder o valor configurado com sp_configure.The MAXDOP query hint can exceed the value configured with sp_configure. Se MAXDOP exceder o valor configurado com o Resource Governor, o Mecanismo de Banco de DadosDatabase Engine usará o valor de MAXDOP do Resource Governor, descrito em ALTER WORKLOAD GROUP (Transact-SQL).If MAXDOP exceeds the value configured with Resource Governor, the Mecanismo de Banco de DadosDatabase Engine uses the Resource Governor MAXDOP value, described in ALTER WORKLOAD GROUP (Transact-SQL). Todas as regras semânticas usadas com a opção de configuração max degree of parallelism são aplicáveis ao usar a dica de consulta MAXDOP.All semantic rules used with the max degree of parallelism configuration option are applicable when you use the MAXDOP query hint. Para obter mais informações, veja Configurar a opção max degree of parallelism de configuração de servidor.For more information, see Configure the max degree of parallelism Server Configuration Option.

Aviso

Se MAXDOP estiver definido como 0, o servidor escolherá o máximo grau de paralelismo.If MAXDOP is set to zero, then the server chooses the max degree of parallelism.

MAXRECURSION number MAXRECURSION number
Especifica o número máximo de recursões permitidas para esta consulta.Specifies the maximum number of recursions allowed for this query. number é um inteiro não negativo entre 0 e 32.767.number is a nonnegative integer between 0 and 32,767. Quando 0 é especificado, nenhum limite é aplicado.When 0 is specified, no limit is applied. Se essa opção não for especificada, o limite padrão para o servidor será de 100.If this option isn't specified, the default limit for the server is 100.

Quando o número especificado ou padrão de limite de MAXRECURSION é atingido durante a execução da consulta, a consulta é encerrada e um erro é retornado.When the specified or default number for MAXRECURSION limit is reached during query execution, the query ends and an error returns.

Por causa desse erro, todos os efeitos da instrução são revertidos.Because of this error, all effects of the statement are rolled back. Se a instrução for do tipo SELECT, poderão ser retornados resultados parciais ou nenhum resultado.If the statement is a SELECT statement, partial results or no results may be returned. Eventuais resultados parciais retornados podem não incluir todas as linhas em níveis de recursão acima do nível de recursão máximo especificado.Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.

Para obter mais informações, confira WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

NO_PERFORMANCE_SPOOLNO_PERFORMANCE_SPOOL
Aplica-se a: do SQL Server 2016 (13.x)SQL Server 2016 (13.x) ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

Impede que um operador de spool seja adicionado aos planos de consulta (exceto para os planos em que o spool é necessário para assegurar uma semântica de atualização válida).Prevents a spool operator from being added to query plans (except for the plans when spool is required to guarantee valid update semantics). O operador de spool pode reduzir o desempenho em alguns cenários.The spool operator may reduce performance in some scenarios. Por exemplo, o spool usa o tempdb e a contenção do tempdb pode ocorrer se houver várias consultas simultâneas em execução com as operações de spool.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 ] )
Instrui o otimizador de consulta a usar um valor específico para uma variável local quando a consulta é compilada e otimizada.Instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. O valor é usado somente durante a otimização da consulta e não durante sua execução.The value is used only during query optimization, and not during query execution.

@variable\_name_@variable\_name_
É o nome de uma variável local usada em uma consulta para a qual um valor pode ser atribuído para uso com a dica de consulta 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
Especifica que o otimizador de consulta usa dados estatísticos em vez do valor inicial para determinar o valor de uma variável local durante a otimização da consulta.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
É um valor constante literal a receber _@variable\_name_ para uso com a dica de consulta OPTIMIZE FOR.Is a literal constant value to be assigned _@variable\_name_ for use with the OPTIMIZE FOR query hint. literal_constant é usado somente durante a otimização de consulta, e não como o valor de _@variable\_name_ durante a execução da consulta.literal_constant is used only during query optimization, and not as the value of _@variable\_name_ during query execution. literal_constant pode ser de um dos tipos de dados de sistema do SQL ServerSQL Server que pode ser expresso como uma constante literal.literal_constant can be of any SQL ServerSQL Server system data type that can be expressed as a literal constant. O tipo de dados de literal_constant precisa ser implicitamente conversível no tipo de dados que _@variable\_name_ faz referências na consulta.The data type of literal_constant must be implicitly convertible to the data type that _@variable\_name_ references in the query.

OPTIMIZE FOR pode anular o comportamento de detecção de parâmetro padrão do otimizador.OPTIMIZE FOR can counteract the optimizer's default parameter detection behavior. Use OPTIMIZE FOR também quando criar guias de plano.Also use OPTIMIZE FOR when you create plan guides. Para obter mais informações, confira Recompilar um procedimento armazenado.For more information, see Recompile a Stored Procedure.

OPTIMIZE FOR UNKNOWNOPTIMIZE FOR UNKNOWN
Instrui o otimizador de consulta a usar dados estatísticos no lugar dos valores iniciais para todas as variáveis locais quando a consulta é compilada e otimizada.Instructs the query optimizer to use statistical data instead of the initial values for all local variables when the query is compiled and optimized. Essa otimização inclui parâmetros criados com parametrização forçada.This optimization includes parameters created with forced parameterization.

Se você usar OPTIMIZE FOR @variable_name = literal_constant e OPTIMIZE FOR UNKNOWN na mesma dica de consulta, o otimizador de consulta usará a literal_constant especificada para um valor específico.If you use OPTIMIZE FOR @variable_name = literal_constant and OPTIMIZE FOR UNKNOWN in the same query hint, the query optimizer will use the literal_constant specified for a specific value. O otimizador de consulta usará UNKNOWN para o restante dos valores de variável.The query optimizer will use UNKNOWN for the rest of the variable values. Os valores só são usados durante a otimização de consulta e não durante a execução das consultas.The values are used only during query optimization, and not during query execution.

PARAMETERIZATION { SIMPLE | FORCED }PARAMETERIZATION { SIMPLE | FORCED }
Especifica as regras de parametrização que o otimizador de consulta do SQL ServerSQL Server aplica à consulta quando ela é compilada.Specifies the parameterization rules that the SQL ServerSQL Server query optimizer applies to the query when it's compiled.

Importante

A dica de consulta PARAMETERIZATION só pode ser especificada dentro de um guia de plano para substituir a configuração atual da opção SET do banco de dados PARAMETERIZATION.The PARAMETERIZATION query hint can only be specified inside a plan guide to override the current setting of the PARAMETERIZATION database SET option. Ela não pode ser especificada diretamente dentro de uma consulta.It can't be specified directly within a query.
Para obter mais informações, confira Especificar comportamento de parametrização de consulta usando guias de plano.For more information, see Specify Query Parameterization Behavior by Using Plan Guides.

SIMPLE instrui o otimizador de consulta a tentar parametrização simples.SIMPLE instructs the query optimizer to attempt simple parameterization. FORCED instrui o otimizador de consulta a tentar a parametrização forçada.FORCED instructs the query optimizer to attempt forced parameterization. Para obter mais informações, consulte Parametrização forçada no Guia de arquitetura de processamento de consulta e Parametrização simples no Guia de arquitetura de processamento de consulta.For more information, see Forced Parameterization in the Query Processing Architecture Guide, and Simple Parameterization in the Query Processing Architecture Guide.

RECOMPILERECOMPILE
Instrui o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine a gerar um plano novo e temporário para a consulta e descartar esse plano imediatamente depois que a consulta conclui a execução.Instructs the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine to generate a new, temporary plan for the query and immediately discard that plan after the query completes execution. O plano de consulta gerado não substitui um plano armazenado em cache quando a mesma consulta é executada sem a dica RECOMPILE.The generated query plan doesn't replace a plan stored in cache when the same query runs without the RECOMPILE hint. Sem especificar RECOMPILE, o Mecanismo de Banco de DadosDatabase Engine armazena em cache os planos de consulta e reutiliza-os.Without specifying RECOMPILE, the Mecanismo de Banco de DadosDatabase Engine caches query plans and reuses them. Ao compilar planos de consulta, a dica de consulta RECOMPILE usa os valores atuais de todas as variáveis locais na consulta.When compiling query plans, the RECOMPILE query hint uses the current values of any local variables in the query. Se a consulta estiver em um procedimento armazenado, os valores atuais são passados para quaisquer parâmetros.If the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE é uma alternativa útil para criar um procedimento armazenado.RECOMPILE is a useful alternative to creating a stored procedure. RECOMPILE usa a cláusula WITH RECOMPILE quando apenas um subconjunto de consultas dentro do procedimento armazenado, em vez de todo o procedimento armazenado, deve ser recompilado.RECOMPILE uses the WITH RECOMPILE clause when only a subset of queries inside the stored procedure, instead of the whole stored procedure, must be recompiled. Para obter mais informações, confira Recompilar um procedimento armazenado.For more information, see Recompile a Stored Procedure. RECOMPILE também é útil para a criação de guias de plano.RECOMPILE is also useful when you create plan guides.

ROBUST PLANROBUST PLAN
Força o otimizador de consulta a tentar um plano que trabalhe para o tamanho máximo de linhas potenciais, possivelmente às custas do desempenho.Forces the query optimizer to try a plan that works for the maximum potential row size, possibly at the expense of performance. Tabelas e operadores intermediários podem ter que armazenar e processar linhas maiores do que qualquer uma das linhas de entrada quando a consulta é processada.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 when the query is processed. As linhas podem ser tão grandes que, às vezes, o operador específico não consegue processá-las.The rows may be so wide that, sometimes, the particular operator can't process the row. Se as linhas tiverem essa dimensão, o Mecanismo de Banco de DadosDatabase Engine produzirá um erro durante a execução da consulta.If rows are that wide, the Mecanismo de Banco de DadosDatabase Engine produces an error during query execution. Usar ROBUST PLAN, você instrui o otimizador de consulta a não considerar os plano de consulta que possam resultar nesse problema.By using ROBUST PLAN, you instruct the query optimizer not to consider any query plans that may run into this problem.

Se um plano não for possível, o otimizador de consulta retornará um erro, em vez de adiar a detecção de erros para a execução da consulta.If such a plan isn't possible, the query optimizer returns an error instead of deferring error detection to query execution. Linhas podem conter colunas de tamanho variável. O Mecanismo de Banco de DadosDatabase Engine permite definir linhas com o tamanho potencial máximo para além da capacidade de processamento do Mecanismo de Banco de DadosDatabase Engine.Rows may contain variable-length columns; the Mecanismo de Banco de DadosDatabase Engine allows for rows to be defined that have a maximum potential size beyond the ability of the Mecanismo de Banco de DadosDatabase Engine to process them. Geralmente, apesar do tamanho potencial máximo, um aplicativo armazena linhas cujos tamanhos reais estão dentro dos limites de processamento do Mecanismo de Banco de DadosDatabase Engine.Generally, despite the maximum potential size, an application stores rows that have actual sizes within the limits that the Mecanismo de Banco de DadosDatabase Engine can process. Se o Mecanismo de Banco de DadosDatabase Engine encontrar uma linha longa demais, será retornado um erro de execução.If the Mecanismo de Banco de DadosDatabase Engine comes across a row that is too long, an execution error is returned.

USE HINT ( ' hint_name ' )USE HINT ( 'hint_name' )
Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) and Banco de dados SQL do AzureAzure SQL Database.

Fornece uma ou mais dicas adicionais ao processador de consultas.Provides one or more additional hints to the query processor. As dicas adicionais são especificadas por um nome de dica entre aspas simples.The additional hints are specified by a hint name inside single quotation marks.

Os seguintes nomes de dica são compatíveis:The following hint names are supported:

  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
    Faz o SQL ServerSQL Server gerar um plano de consulta usando a suposição de Confinamento simples, em vez da suposição de Confinamento de base padrão para junções, no modelo de Estimativa de cardinalidade do otimizador de consulta do SQL Server 2014 (12.x)SQL Server 2014 (12.x) ou mais recente.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. O nome da dica é equivalente ao sinalizador de rastreamento 9476.This hint name is equivalent to trace flag 9476.

  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    Faz com que o SQL ServerSQL Server gere um plano usando a seletividade mínima ao estimar predicados AND para os filtros a serem considerados para correlação.Causes SQL ServerSQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation. O nome da dica é equivalente ao sinalizador de rastreamento 4137 quando usado com o modelo de estimativa de cardinalidade do SQL Server 2012 (11.x)SQL Server 2012 (11.x) e com versões anteriores, além disso, tem um efeito semelhante quando o sinalizador de rastreamento 9471 é usado com o modelo de estimativa de cardinalidade do SQL Server 2014 (12.x)SQL Server 2014 (12.x) ou superior.This hint name 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_BATCH_MODE_ADAPTIVE_JOINS''DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
    Desabilita junções adaptáveis do modo de lote.Disables batch mode adaptive joins. Para obter mais informações, confira Junções Adaptáveis de modo de lote.For more information, see Batch mode Adaptive Joins. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de dados SQL do AzureAzure SQL Database.

  • 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
    Desabilita os comentários de concessão de memória do modo de lote.Disables batch mode memory grant feedback. Para obter mais informações, veja Batch mode memory grant feedback (Comentários de concessão de memória de modo de lote).For more information, see Batch mode memory grant feedback. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de dados SQL do AzureAzure SQL Database.

  • 'DISABLE_DEFERRED_COMPILATION_TV''DISABLE_DEFERRED_COMPILATION_TV'
    Desabilita a compilação adiada de variável da tabela.Disables table variable deferred compilation. Para saber mais, veja Compilação adiada de variável da tabela.For more information, see Table variable deferred compilation. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2019SQL Server 2019) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2019SQL Server 2019) and Banco de dados SQL do AzureAzure SQL Database.

  • 'DISABLE_INTERLEAVED_EXECUTION_TVF''DISABLE_INTERLEAVED_EXECUTION_TVF'
    Desabilita a execução intercalada para funções com valor de tabela de várias instruções.Disables interleaved execution for multi-statement table-valued functions. Para saber mais, veja Execução intercalada para funções com valor de tabela de várias instruções.For more information, see Interleaved execution for multi-statement table-valued functions. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de dados SQL do AzureAzure SQL Database.

  • 'DISABLE_OPTIMIZED_NESTED_LOOP''DISABLE_OPTIMIZED_NESTED_LOOP'
    Instrui o processador de consultas a não usar uma operação de classificação (classificação em lote) para junções otimizadas de loops aninhados ao gerar um plano de consulta.Instructs the query processor not to use a sort operation (batch sort) for optimized nested loop joins when generating a query plan. O nome da dica é equivalente ao sinalizador de rastreamento 2340.This hint name is equivalent to trace flag 2340.

  • 'DISABLE_OPTIMIZER_ROWGOAL' 'DISABLE_OPTIMIZER_ROWGOAL'
    Faz com que o SQL Server gere um plano que não usa as modificações de meta de linha com consultas que contêm estas palavras-chave:Causes SQL Server to generate a plan that doesn't use row goal modifications with queries that contain these keywords:

    • INÍCIOTOP
    • OPTION (FAST N)OPTION (FAST N)
    • ININ
    • EXISTSEXISTS

    O nome da dica é equivalente ao sinalizador de rastreamento 4138.This hint name is equivalent to trace flag 4138.

  • 'DISABLE_PARAMETER_SNIFFING''DISABLE_PARAMETER_SNIFFING'
    Instrui o otimizador de consulta a usar a distribuição média de dados durante a compilação de uma consulta com um ou mais parâmetros.Instructs query optimizer to use average data distribution while compiling a query with one or more parameters. Essa instrução cria o plano de consulta independentemente do valor de parâmetro que foi usado pela primeira vez quando a consulta foi compilada.This instruction makes the query plan independent on the parameter value that was first used when the query was compiled. O nome da dica é equivalente ao sinalizador de rastreamento 4136 ou à definição PARAMETER_SNIFFING = OFF da Configuração de Escopo do Banco de Dados.This hint name is equivalent to trace flag 4136 or Database Scoped Configuration setting PARAMETER_SNIFFING = OFF.

  • 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
    Desabilita os comentários de concessão de memória do modo de linha.Disables row mode memory grant feedback. Para obter mais informações, veja Batch mode memory grant feedback (Comentários de concessão de memória de modo de lote).For more information, see Row mode memory grant feedback. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2019SQL Server 2019) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2019SQL Server 2019) and Banco de dados SQL do AzureAzure SQL Database.

  • 'DISABLE_TSQL_SCALAR_UDF_INLINING''DISABLE_TSQL_SCALAR_UDF_INLINING'
    Desabilita o embutimento de UDF escalar.Disables scalar UDF inlining. Para saber mais, confira Scalar UDF Inlining (Embutimento de UDF escalar).For more information, see Scalar UDF Inlining. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2019SQL Server 2019).Applies to: SQL ServerSQL Server (starting with SQL Server 2019SQL Server 2019).

  • 'DISALLOW_BATCH_MODE''DISALLOW_BATCH_MODE'
    Desabilita a execução do modo de lote.Disables batch mode execution. Para obter mais informações, consulte Modos de execução.For more information, see Execution modes. Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de dados SQL do AzureAzure SQL Database.

  • 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS''ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
    Habilita as estatísticas rápidas geradas automaticamente (aditamento de histograma) para qualquer coluna de índice inicial para a qual a estimativa de cardinalidade seja necessária.Enables automatically generated quick statistics (histogram amendment) for any leading index column for which cardinality estimation is needed. O histograma usado para estimar a cardinalidade será ajustado no tempo de compilação da consulta para considerar o valor máximo ou mínimo real dessa coluna.The histogram used to estimate cardinality will be adjusted at query compile time to account for actual maximum or minimum value of this column. O nome da dica é equivalente ao sinalizador de rastreamento 4139.This hint name is equivalent to trace flag 4139.

  • 'ENABLE_QUERY_OPTIMIZER_HOTFIXES''ENABLE_QUERY_OPTIMIZER_HOTFIXES'
    Habilita hotfixes do otimizador de consulta (alterações liberadas nas atualizações cumulativas do SQL Server e nos Service Packs).Enables query optimizer hotfixes (changes released in SQL Server Cumulative Updates and Service Packs). O nome da dica é equivalente ao sinalizador de rastreamento 4199 ou à definição QUERY_OPTIMIZER_HOTFIXES = ON da Configuração de Escopo do Banco de Dados.This hint name is equivalent to trace flag 4199 or Database Scoped Configuration setting QUERY_OPTIMIZER_HOTFIXES = ON.

  • 'FORCE_DEFAULT_CARDINALITY_ESTIMATION''FORCE_DEFAULT_CARDINALITY_ESTIMATION'
    Força o otimizador de consulta a usar o modelo de estimativa de cardinalidade que corresponde ao nível de compatibilidade do banco de dados atual.Forces the Query Optimizer to use Cardinality Estimation model that corresponds to the current database compatibility level. Use essa dica para substituir a definição LEGACY_CARDINALITY_ESTIMATION = ON da Configuração de Escopo do Banco de Dados ou o sinalizador de rastreamento 9481.Use this hint to override Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION = ON or trace flag 9481.

  • 'FORCE_LEGACY_CARDINALITY_ESTIMATION' 'FORCE_LEGACY_CARDINALITY_ESTIMATION'
    Força o otimizador de consulta a usar o modelo de estimativa de cardinalidade do SQL Server 2012 (11.x)SQL Server 2012 (11.x) e de versões anteriores.Forces the query optimizer to use Cardinality Estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions. O nome da dica é equivalente ao sinalizador de rastreamento 9481 ou à definição LEGACY_CARDINALITY_ESTIMATION = ON da Configuração de Escopo do Banco de Dados.This hint name is equivalent to trace flag 9481 or Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION = ON.

  • 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
    Força o comportamento do otimizador de consulta em um nível de consulta.Forces the query optimizer behavior at a query level. Esse comportamento ocorrerá se a consulta foi compilada com o nível de compatibilidade do banco de dados n, onde n é um nível de compatibilidade do banco de dados com suporte.This behavior happens as if the query was compiled with database compatibility level n, where n is a supported database compatibility level. Confira sys.dm_exec_valid_use_hints para obter uma lista atual de valores com suporte para n.Refer to sys.dm_exec_valid_use_hints for a list of currently supported values for n. Aplica-se a: SQL ServerSQL Server (a partir do SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU10).Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU10).

    Observação

    A dica QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n não substituirá a configuração de estimativa de cardinalidade padrão ou herdada se ela for forçada pela configuração de escopo do banco de dados, pelo sinalizador de rastreamento ou por outra dica de consulta, como QUERYTRACEON.The QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n hint doesn't override default or legacy cardinality estimation setting, if it's forced through database scoped configuration, trace flag or another query hint such as QUERYTRACEON.
    Essa dica só afeta o comportamento do otimizador de consulta.This hint only affects the behavior of the query optimizer. Ela não afeta outros recursos do SQL ServerSQL Server que podem depender do nível de compatibilidade do banco de dados, como a disponibilidade de determinados recursos de banco de dados.It doesn't affect other features of SQL ServerSQL Server that may depend on the database compatibility level, such as the availability of certain database features.
    Para saber mais sobre essa dica, confira Escolha do desenvolvedor: dicas do modelo de execução de consulta.To learn more about this hint, see Developer's Choice: Hinting Query Execution model.

  • 'QUERY_PLAN_PROFILE''QUERY_PLAN_PROFILE'
    Permite a criação de perfil leve para a consulta.Enables lightweight profiling for the query. Quando uma consulta que contém essa nova dica é concluída, um novo Evento Estendido, query_plan_profile, é disparado.When a query that contains this new hint finishes, a new Extended Event, query_plan_profile, is fired. Esse evento estendido expõe as estatísticas de execução e o plano de execução real XML semelhante ao evento estendido query_post_execution_showplan, mas apenas para consultas que contêm a nova dica.This extended event exposes execution statistics and actual execution plan XML similar to the query_post_execution_showplan extended event but only for queries that contains the new hint. Aplica-se a: SQL ServerSQL Server (começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 CU3 e SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU11).Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 CU3 and SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU11).

    Observação

    Se você habilitar a coleta de evento estendido query_post_execution_showplan, isso adicionará a infraestrutura de criação de perfil padrão a cada consulta que esteja sendo executada no servidor e, portanto, poderá afetar o desempenho geral do servidor.If you enable collecting the query_post_execution_showplan extended event, this will add standard profiling infrastructure to every query that is running on the server and therefore may affect overall server performance.
    Se você habilitar a coleção do evento estendido query_thread_profile para usar infraestrutura de criação de perfil leve, isso resultará em muito menos sobrecarga de desempenho, mas ainda afetará o desempenho geral do servidor.If you enable the collection of query_thread_profile extended event to use lightweight profiling infrastructure instead, this will result in much less performance overhead but will still affect overall server performance.
    Se você habilitar o evento estendido de query_plan_profile, isso só habilitará a infraestrutura de criação de perfil leve para uma consulta executada com QUERY_PLAN_PROFILE, portanto, não afetará outras cargas de trabalho no servidor.If you enable the query_plan_profile extended event, this will only enable the lightweight profiling infrastructure for a query that executed with the QUERY_PLAN_PROFILE and therefore will not affect other workloads on the server. Use essa dica para criar o perfil de uma consulta específica sem afetar outras partes da carga de trabalho do servidor.Use this hint to profile a specific query without affecting other parts of the server workload. Para saber mais sobre a criação de perfil leve, confira Infraestrutura de criação de perfil de consulta.To learn more about lightweight profiling, see Query Profiling Infrastructure.

A lista de todos os nomes de USE HINT compatíveis pode ser consultada usando a exibição de gerenciamento dinâmico 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.

Dica

Os nomes de dica diferenciam maiúsculas de minúsculas.Hint names are case-insensitive.

Importante

Algumas dicas USE HINT podem entrar em conflito com os sinalizadores de rastreamento habilitados no nível global ou no nível da sessão, ou com as definições de configurações de escopo do banco de dados.Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings. Nesse caso, a dica no nível da consulta (USE HINT) sempre terá precedência.In this case, the query level hint (USE HINT) always takes precedence. Se um USE HINT estiver em conflito com outra dica de consulta ou com um sinalizador de rastreamento habilitado no nível da consulta (como por QUERYTRACEON), o SQL ServerSQL Server gerará um erro ao tentar executar a consulta.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'
Força o otimizador de consulta a usar um plano de consulta existente para uma consulta especificada por ' xml_plan ' .Forces the query optimizer to use an existing query plan for a query that is specified by 'xml_plan'. USE PLAN não pode ser especificado com instruções INSERT, UPDATE, MERGE ou DELETE.USE PLAN can't be specified with INSERT, UPDATE, MERGE, or DELETE statements.

TABLE HINT ( exposed_object_name [ , <table_hint> [ [ , ]...n ] ] ) Aplica a dica de tabela especificada à tabela ou à exibição que corresponde ao 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. É recomendável usar uma dica de tabela como uma dica de consulta apenas no contexto de um guia de plano.We recommend using a table hint as a query hint only in the context of a plan guide.

exposed_object_name pode ser uma das seguintes referências:exposed_object_name can be one of the following references:

  • Quando um alias é usado para a tabela ou exibição na cláusula FROM da consulta, exposed_object_name é o 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 um alias não é usado, exposed_object_name é a correspondência exata da tabela ou exibição referenciada na cláusula FROM.When an alias isn't used, exposed_object_name is the exact match of the table or view referenced in the FROM clause. Por exemplo, se a tabela ou exibição for referenciada usando um nome de duas partes, exposed_object_name será esse mesmo nome de duas partes.For example, if the table or view is referenced using a two-part name, exposed_object_name is the same two-part name.

Quando você especifica exposed_object_name sem especificar também uma dica de tabela, todos os índices especificados na consulta como parte de uma tabela para o objeto são desconsiderados.When you specify exposed_object_name without also specifying a table hint, any indexes you specify in the query as part of a table hint for the object are disregarded. O otimizador de consulta, em seguida, determina o uso do índice.The query optimizer then determines index usage. Você pode usar essa técnica para eliminar o efeito de uma dica de tabela INDEX quando não puder modificar a consulta original.You can use this technique to eliminate the effect of an INDEX table hint when you can't modify the original query. Consulte o exemplo 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 } É a dica de tabela a ser aplicada à tabela ou exibição que corresponde a exposed_object_name com uma dica de consulta.<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. Para obter uma descrição dessas dicas, consulte Dicas de tabela (Transact-SQL).For a description of these hints, see Table Hints (Transact-SQL).

Dicas de tabela diferentes de INDEX, FORCESCAN e FORCESEEK não são permitidas como dicas de consulta, a não ser que a consulta possua uma cláusula WITH que especifique a dica de tabela.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. Para obter mais informações, consulte Comentários.For more information, see Remarks.

Cuidado

A especificação de FORCESEEK com parâmetros limita o número de planos que podem ser considerados pelo otimizador mais do que a especificação de FORCESEEK sem parâmetros.Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. Isso pode resultar em um erro "Não é possível gerar o plano" em mais casos.This may cause a "Plan cannot be generated" error to occur in more cases. Em uma versão futura, as modificações internas no otimizador talvez permitam a consideração de mais planos.In a future release, internal modifications to the optimizer may allow more plans to be considered.

RemarksRemarks

As dicas de consultas não podem ser especificadas em uma instrução INSERT, exceto quando uma cláusula SELECT é usada na instrução.Query hints can't be specified in an INSERT statement, except when a SELECT clause is used inside the statement.

Só podem ser especificadas dicas de consulta na consulta de nível superior, e não em subconsultas.Query hints can be specified only in the top-level query, not in subqueries. Quando uma dica de tabela é especificada como uma dica de consulta, a dica pode ser especificada na consulta de nível superior ou em uma subconsulta.When a table hint is specified as a query hint, the hint can be specified in the top-level query or in a subquery. No entanto, o valor especificado para exposed_object_name na cláusula TABLE HINT deve corresponder exatamente ao nome exposto na consulta ou subconsulta.However, the value specified for exposed_object_name in the TABLE HINT clause must match exactly the exposed name in the query or subquery.

Especificando dicas de tabela como dicas de consultaSpecifying Table Hints as Query Hints

É recomendável usar a dica de tabela INDEX, FORCESCAN ou FORCESEEK como dica de consulta apenas no contexto de um guia de plano.We recommend using the INDEX, FORCESCAN, or FORCESEEK table hint as a query hint only in the context of a plan guide. Os guias de plano são úteis quando não é possível modificar a consulta original, por exemplo, por se tratar de um aplicativo de terceiros.Plan guides are useful when you can't modify the original query, for example, because it's a third-party application. A dica de consulta especificada na guia de plano é adicionada à consulta antes de ela ser compilada e otimizada.The query hint specified in the plan guide is added to the query before it's compiled and optimized. Para consultas ad hoc, use a cláusula TABLE HINT apenas ao testar instruções de guia de plano.For ad-hoc queries, use the TABLE HINT clause only when testing plan guide statements. Para todas as demais consultas ad hoc, é recomendável especificar essas dicas apenas como dicas de tabela.For all other ad-hoc queries, we recommend specifying these hints only as table hints.

Quando especificadas como uma dica de consulta, as dicas de tabela INDEX, FORCESCAN e FORCESEEK são válidas para os objetos a seguir:When specified as a query hint, the INDEX, FORCESCAN, and FORCESEEK table hints are valid for the following objects:

  • TabelasTables
  • ExibiçõesViews
  • Exibições indexadasIndexed views
  • Expressões de tabela comuns (a dica deve ser especificada na instrução SELECT cujo conjunto de resultados popula a expressão de tabela comum)Common table expressions (the hint must be specified in the SELECT statement whose result set populates the common table expression)
  • Exibições de gerenciamento dinâmicoDynamic management views
  • Subconsultas nomeadasNamed subqueries

Você pode especificar as dicas de tabela INDEX, FORCESCAN e FORCESEEK como dicas de consulta para uma consulta que não tenha dicas de tabela.You can specify INDEX, FORCESCAN, and FORCESEEK table hints as query hints for a query that doesn't have any existing table hints. Você também pode usá-las para substituir as dicas existente INDEX, FORCESCAN ou FORCESEEK na consulta, respectivamente.You can also use them to replace existing INDEX, FORCESCAN, or FORCESEEK hints in the query, respectively.

Dicas de tabela diferentes de INDEX, FORCESCAN e FORCESEEK não são permitidas como dicas de consulta, a não ser que a consulta possua uma cláusula WITH que especifique a dica de tabela.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. Nesse caso, uma dica correspondente também deve ser especificada como uma dica de consulta.In this case, a matching hint must also be specified as a query hint. Especifique a dica correspondente como uma dica de consulta usando TABLE HINT na cláusula OPTION.Specify the matching hint as a query hint by using TABLE HINT in the OPTION clause. Essa especificação preserva a semântica da consulta.This specification preserves the query's semantics. Por exemplo, se a consulta contiver a dica de tabela NOLOCK, a cláusula OPTION no parâmetro **@hints** do guia de plano também precisará conter a dica 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. Consulte o exemplo K.See Example K.

O Erro 8072 ocorre em alguns cenários.Error 8072 occurs in a couple of scenarios. Um deles é quando você especifica uma dica de tabela diferente de INDEX, FORCESCAN ou FORCESEEK usando TABLE HINT na cláusula OPTION sem uma dica de consulta correspondente.One is when you specify a table hint other than INDEX, FORCESCAN, or FORCESEEK by using TABLE HINT in the OPTION clause without a matching query hint. O segundo cenário é o oposto.The second scenario is the other way around. Esse erro indica que a cláusula OPTION pode modificar a semântica da consulta, e a consulta falhará.This error indicates the OPTION clause can cause the semantics of the query to change, and the query fails.

ExemplosExamples

A.A. Usando MERGE JOINUsing MERGE JOIN

O exemplo a seguir especifica que MERGE JOIN executa a operação JOIN na consulta.The following example specifies that MERGE JOIN runs the JOIN operation in the query. O exemplo usa o banco de dados 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. Usando OPTIMIZE FORUsing OPTIMIZE FOR

O exemplo a seguir instrui o otimizador de consulta a usar o valor 'Seattle' para a variável local @city_name e a usar dados estatísticos para determinar o valor da variável local @postal_code ao otimizar a consulta.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. O exemplo usa o banco de dados 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. Usando MAXRECURSIONUsing MAXRECURSION

MAXRECURSION pode ser usado para impedir que uma expressão de tabela comum recursiva malformada entre em loop infinito.MAXRECURSION can be used to prevent a poorly formed recursive common table expression from entering into an infinite loop. O exemplo a seguir cria um loop infinito intencionalmente e usa a dica MAXRECURSION para limitar o número de níveis de recursão para dois.The following example intentionally creates an infinite loop and uses the MAXRECURSION hint to limit the number of recursion levels to two. O exemplo usa o banco de dados 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  

Depois que o erro de codificação for corrigido, MAXRECURSION não será mais necessário.After the coding error is corrected, MAXRECURSION is no longer required.

D.D. Usando MERGE UNIONUsing MERGE UNION

O exemplo a seguir usa a dica de consulta MERGE UNION.The following example uses the MERGE UNION query hint. O exemplo usa o banco de dados 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. Usando HASH GROUP e FASTUsing HASH GROUP and FAST

O exemplo a seguir usa as dicas de consulta HASH GROUP e FAST.The following example uses the HASH GROUP and FAST query hints. O exemplo usa o banco de dados 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. Usando MAXDOPUsing MAXDOP

O exemplo a seguir usa a dica de consulta MAXDOP.The following example uses the MAXDOP query hint. O exemplo usa o banco de dados AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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. Usando INDEXUsing INDEX

O exemplo a seguir usa a dica INDEX.The following examples use the INDEX hint. O primeiro exemplo especifica um único índice.The first example specifies a single index. O segundo exemplo especifica vários índices para uma única referência de tabela.The second example specifies multiple indexes for a single table reference. Em ambos os exemplos, como você aplica a dica INDEX em uma tabela que usa um alias, a cláusula TABLE HINT também deve especificar o mesmo alias do nome do objeto exposto.In both examples, because you apply the INDEX hint on a table that uses an alias, the TABLE HINT clause must also specify the same alias as the exposed object name. O exemplo usa o banco de dados 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. Usando FORCESEEKUsing FORCESEEK

O exemplo a seguir usa a dica de tabela FORCESEEK.The following example uses the FORCESEEK table hint. A cláusula TABLE HINT também deve especificar o mesmo nome de duas partes que o nome do objeto exposto.The TABLE HINT clause must also specify the same two-part name as the exposed object name. Especifique o nome ao aplicar a dica INDEX em uma tabela que usa um nome de duas partes.Specify the name when you apply the INDEX hint on a table that uses a two-part name. O exemplo usa o banco de dados 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. Usando várias dicas de tabelaUsing multiple table hints

O exemplo a seguir aplica a dica INDEX a uma tabela e a dica FORCESEEK a outra.The following example applies the INDEX hint to one table and the FORCESEEK hint to another. O exemplo usa o banco de dados 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. Usando TABLE HINT para substituir uma dica de tabela existenteUsing TABLE HINT to override an existing table hint

O exemplo a seguir mostra como usar a dica TABLE HINT.The following example shows how to use the TABLE HINT hint. É possível usar a dica sem especificar uma dica para substituir o comportamento da dica de tabela INDEX que você especifica na cláusula FROM da consulta.You can use the hint without specifying a hint to override the INDEX table hint behavior you specify in the FROM clause of the query. O exemplo usa o banco de dados 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. Especificando dicas de tabela que afetam a semânticaSpecifying semantics-affecting table hints

O exemplo a seguir contém duas dicas de tabela na consulta: NOLOCK, que afeta a semântica, e INDEX, que não afeta a semântica.The following example contains two table hints in the query: NOLOCK, which is semantic-affecting, and INDEX, which is non-semantic-affecting. Para preservar a semântica da consulta, a dica NOLOCK é especificada na cláusula OPTIONS do guia de plano.To preserve the semantics of the query, the NOLOCK hint is specified in the OPTIONS clause of the plan guide. Em conjunto com a dica NOLOCK, especifique as dicas INDEX e FORCESEEK e substitua a dica INDEX, que não afeta a semântica, na consulta durante a compilação e otimização da instrução.Along with the NOLOCK hint, specify the INDEX and FORCESEEK hints and replace the non-semantic-affecting INDEX hint in the query during statement compilation and optimization. O exemplo usa o banco de dados 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    

O exemplo a seguir mostra um método alternativo para preservar a semântica da consulta e permitir que o otimizador escolha um índice diferente do índice especificado na dica de tabela.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. Permita que o otimizador escolha especificando a dica NOLOCK na cláusula OPTIONS.Allow the optimizer to choose by specifying the NOLOCK hint in the OPTIONS clause. Você especifica a dica porque ela afeta a semântica.You specify the hint because it's semantic-affecting. Em seguida, especifica a palavra-chave TABLE HINT com apenas uma referência de tabela e nenhuma dica INDEX.Then, specify the TABLE HINT keyword with only a table reference and no INDEX hint. O exemplo usa o banco de dados 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. Usando USE HINTUsing USE HINT

O exemplo a seguir usa as dicas de consulta RECOMPILE e USE HINT.The following example uses the RECOMPILE and USE HINT query hints. O exemplo usa o banco de dados AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

Aplica-se a: Banco de dados SQL do AzureAzure SQL Database, SQL Server 2016 (13.x)SQL Server 2016 (13.x).Applies to: Banco de dados SQL do 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  

Consulte TambémSee Also

Hints (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)
Sinalizadores de rastreamento Trace Flags
Convenções de sintaxe Transact-SQLTransact-SQL Syntax Conventions