Sugerencias (Transact-SQL): consultaHints (Transact-SQL) - Query

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Sugerencias de consulta especifica que en toda la consulta se deben utilizar las sugerencias especificadas.Query hints specify that the indicated hints should be used throughout the query. Afectan a todos los operadores de la instrucción.They affect all operators in the statement. Si hay un argumento UNION implicado en la consulta principal, solo la última consulta que implique una operación UNION puede contener la cláusula OPTION.If UNION is involved in the main query, only the last query involving a UNION operation can have the OPTION clause. Las sugerencias de consulta se especifican como parte de la cláusula OPTION.Query hints are specified as part of the OPTION clause. El error 8622 se produce si una o varias sugerencias de consulta provocan que el optimizador de consultas no genere un plan válido.Error 8622 occurs if one or more query hints cause the Query Optimizer not to generate a valid plan.

Precaución

Como el optimizador de consultas de SQL ServerSQL Server suele seleccionar el mejor plan de ejecución para las consultas, se recomienda que solo los desarrolladores y administradores de bases de datos experimentados usen estas sugerencias y que lo hagan como último recurso.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.

Se aplica a:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

SintaxisSyntax

<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 las agregaciones que la cláusula GROUP BY o DISTINCT de la consulta describe deben usar hash o un orden.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 las operaciones UNION se deben ejecutar mediante la combinación, hash o concatenación de conjuntos UNION.Specifies that all UNION operations are run by merging, hashing, or concatenating UNION sets. Si se especifica más de una sugerencia UNION, el optimizador de consultas seleccionará la estrategia menos costosa entre las sugerencias 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 las operaciones de combinación se realicen mediante LOOP JOIN, MERGE JOIN o HASH JOIN en toda la consulta.Specifies all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. Si especifica más de una sugerencia de combinación, el optimizador seleccionará la estrategia menos costosa de entre las permitidas.If you specify more than one join hint, the optimizer selects the least expensive join strategy from the allowed ones.

Si especifica una sugerencia de combinación en la cláusula FROM de la misma consulta para un par de tablas específico, esta sugerencia de combinación tendrá prioridad en la combinación de las dos tablas.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. Las sugerencias de consulta, sin embargo, todavía se deben respetar.The query hints, though, must still be honored. La sugerencia de combinación para el par de tablas solo puede restringir la selección de los métodos de combinación permitidos en la sugerencia de consulta.The join hint for the pair of tables may only restrict the selection of allowed join methods in the query hint. Para obtener más información, vea Sugerencias de combinación (Transact-SQL).For more information, see Join Hints (Transact-SQL).

EXPAND VIEWSEXPAND VIEWS
Especifica que las vistas indexadas se expanden.Specifies the indexed views are expanded. También especifica que el optimizador de consultas no considerará ninguna vista indexada como reemplazo de ninguna parte de la consulta.Also specifies the Query Optimizer won't consider any indexed view as a replacement for any query part. Una vista se expande cuando la definición de la vista reemplaza el nombre de la vista en el texto de la consulta.A view is expanded when the view definition replaces the view name in the query text.

Esta sugerencia de consulta virtualmente no permite el uso directo de vistas indizadas ni índices en vistas indizadas en el plan de consulta.This query hint virtually disallows direct use of indexed views and indexes on indexed views in the query plan.

La vista indexada sigue contraída si hay una referencia directa a la vista en la parte SELECT de la consulta.The indexed view remains condensed if there's a direct reference to the view in the query's SELECT part. La vista también permanece contraída si se especifica WITH (NOEXPAND) o WITH (NOEXPAND, INDEX (index_value_ [ , ...n ] ) ).The view also remains condensed if you specify WITH (NOEXPAND) or WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) ). Para más información sobre la sugerencia de consulta NOEXPAND, vea Uso de NOEXPAND.For more information about the query hint NOEXPAND, see Using NOEXPAND.

La sugerencia solo afecta a las vistas de la parte SELECT de las instrucciones, incluidas las vistas de las instrucciones INSERT, UPDATE, MERGE y DELETE.The hint only affects the views in the statements' SELECT part, including those views in INSERT, UPDATE, MERGE, and DELETE statements.

FAST número_filasFAST number_rows
Especifica que la consulta está optimizada para una recuperación rápida de las primeras número_filas.Specifies that the query is optimized for fast retrieval of the first number_rows. Este resultado es un entero no negativo.This result is a nonnegative integer. Después de que se devuelven las primeras número_filas, la consulta continúa la ejecución y presenta su 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 el orden de combinación que indica la sintaxis de la consulta se mantenga durante la optimización de la consulta.Specifies that the join order indicated by the query syntax is preserved during query optimization. El uso de FORCE ORDER no afecta al posible comportamiento de inversión de roles del optimizador de consultas.Using FORCE ORDER doesn't affect possible role reversal behavior of the Query Optimizer.

Nota

En una instrucción MERGE, se obtiene acceso a la tabla de origen antes que a la tabla de destino como el orden de combinación predeterminado, a menos que se especifique la cláusula 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. Al especificar FORCE ORDER, se conserva este comportamiento predeterminado.Specifying FORCE ORDER preserves this default behavior.

{ FORCE | DISABLE } EXTERNALPUSHDOWN{ FORCE | DISABLE } EXTERNALPUSHDOWN
Fuerza o deshabilita la aplicación del cálculo de expresiones válidas en Hadoop.Force or disable the pushdown of the computation of qualifying expressions in Hadoop. Solo se aplica a las consultas que usan PolyBase.Only applies to queries using PolyBase. No se aplicará a Azure Storage.Won't push down to Azure storage.

KEEP PLANKEEP PLAN
Fuerza al optimizador de consultas a aumentar el umbral estimado para volver a compilar una consulta.Forces the Query Optimizer to relax the estimated recompile threshold for a query. El umbral estimado para volver a compilar inicia una nueva compilación automática para la consulta cuando se ha realizado el número estimado de cambios de columnas indexados en una tabla mediante la ejecución de una de las siguientes instrucciones: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
  • DeleteDELETE
  • MERGEMERGE
  • INSERTINSERT

Al especificar KEEP PLAN, se asegura de que no se volverá a compilar una consulta con tanta frecuencia cuando se producen varias actualizaciones en una tabla.Specifying KEEP PLAN makes sure a query won't be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
Fuerza al optimizador de consultas a no compilar de nuevo una consulta debido a cambios en las estadísticas.Forces the Query Optimizer not to recompile a query because of changes in statistics. Al especificar KEEPFIXED PLAN, se asegura de que una consulta solo se vuelve a compilar si el esquema de las tablas subyacentes cambia o si sp_recompile se ejecuta en estas tablas.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
Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2012 (11.x)SQL Server 2012 (11.x) hasta SQL Server 2017SQL Server 2017.Applies to: SQL ServerSQL Server (staring with SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

Impide que la consulta use un índice no agrupado de almacén de columnas optimizado para memoria.Prevents the query from using a nonclustered memory optimized columnstore index. Si la consulta contiene la sugerencia de consulta para evitar el uso del índice de almacén de columnas y una sugerencia de índice para usar un índice de almacén de columnas, las sugerencias están en conflicto y la consulta devuelve un error.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 = porcentaje MAX_GRANT_PERCENT = percent
Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and Base de datos SQL de AzureAzure SQL Database.

Tamaño de concesión de memoria máximo en PERCENT.The maximum memory grant size in PERCENT. Se garantiza que la consulta no superará este límite.The query is guaranteed not to exceed this limit. El límite real puede ser menor si la configuración de Resource Governor es inferior al valor especificado por esta sugerencia.The actual limit can be lower if the Resource Governor setting is lower than the value specified by this hint. Los valores válidos están comprendidos entre 0,0 y 100,0.Valid values are between 0.0 and 100.0.

MIN_GRANT_PERCENT = porcentaje MIN_GRANT_PERCENT = percent
Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and Base de datos SQL de AzureAzure SQL Database.

Tamaño de concesión de memoria mínimo en PERCENT = % del límite predeterminado.The minimum memory grant size in PERCENT = % of default limit. Se garantiza que la consulta obtendrá el valor MAX(required memory, min grant) porque se requiere al menos la memoria necesaria para iniciar una consulta.The query is guaranteed to get MAX(required memory, min grant) because at least required memory is needed to start a query. Los valores válidos están comprendidos entre 0,0 y 100,0.Valid values are between 0.0 and 100.0.

MAXDOP número MAXDOP number
Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2008SQL Server 2008) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2008SQL Server 2008) and Base de datos SQL de AzureAzure SQL Database.

Invalida la opción de configuración de grado máximo de paralelismo de sp_configure.Overrides the max degree of parallelism configuration option of sp_configure. También invalida Resource Governor para la consulta que especifica esta opción.Also overrides the Resource Governor for the query specifying this option. La sugerencia de consulta MAXDOP puede superar el valor configurado con sp_configure.The MAXDOP query hint can exceed the value configured with sp_configure. Si MAXDOP supera el valor configurado con Resource Governor, el Motor de base de datosDatabase Engine usa el valor MAXDOP de Resource Governor, descrito en ALTER WORKLOAD GROUP (Transact-SQL).If MAXDOP exceeds the value configured with Resource Governor, the Motor de base de datosDatabase Engine uses the Resource Governor MAXDOP value, described in ALTER WORKLOAD GROUP (Transact-SQL). Se pueden aplicar todas las reglas semánticas usadas con la opción de configuración Grado máximo de paralelismo cuando se usa la sugerencia 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 obtener más información, vea Establecer la opción de configuración del servidor Grado máximo de paralelismo.For more information, see Configure the max degree of parallelism Server Configuration Option.

Advertencia

Si MAXDOP se establece en cero, el servidor elige el grado máximo de paralelismo.If MAXDOP is set to zero, then the server chooses the max degree of parallelism.

MAXRECURSION number MAXRECURSION number
Especifica el número máximo de recursiones permitidas para esta consulta.Specifies the maximum number of recursions allowed for this query. number es un entero no negativo entre 0 y 32 767.number is a nonnegative integer between 0 and 32,767. Cuando se especifica 0, no se aplica ningún límite.When 0 is specified, no limit is applied. Si no se especifica esta opción, el límite predeterminado para el servidor es 100.If this option isn't specified, the default limit for the server is 100.

Cuando se alcanza el número predeterminado o especificado para el límite de MAXRECURSION durante la ejecución de la consulta, dicha consulta finaliza y se devuelve un error.When the specified or default number for MAXRECURSION limit is reached during query execution, the query ends and an error returns.

Debido a este error, todos los efectos de la instrucción se revierten.Because of this error, all effects of the statement are rolled back. Si la instrucción es una instrucción SELECT, es posible que no se devuelva ningún resultado o que los resultados sean parciales.If the statement is a SELECT statement, partial results or no results may be returned. Puede que los resultados parciales no incluyan todas las filas de los niveles de recursividad que superen el nivel de recursividad máximo especificado.Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.

Para más información, vea WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

NO_PERFORMANCE_SPOOLNO_PERFORMANCE_SPOOL
Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and Base de datos SQL de AzureAzure SQL Database.

Impide que se agregue un operador de cola de impresión a planes de consulta (excepto a los planes en los que se requiere que la cola de impresión garantice una semántica de actualización 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). En algunos escenarios, el operador de cola de impresión puede reducir el rendimiento.The spool operator may reduce performance in some scenarios. Por ejemplo, la cola de impresión usa tempdb, y se puede producir la contención de tempdb si se ejecutan muchas consultas simultáneas con las operaciones de cola de impresión.For example, the spool uses tempdb, and tempdb contention can occur if there are many concurrent queries running with the spool operations.

OPTIMIZE FOR ( @nombre_de variable { UNKNOWN | = constante_literal } [ , ...n ] )OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
Indica al optimizador de consultas que utilice un valor concreto para una variable local cuando la consulta se compila y optimiza.Instructs the Query Optimizer to use a particular value for a local variable when the query is compiled and optimized. El valor se utiliza solo durante la optimización de la consulta y no durante la ejecución de la misma.The value is used only during query optimization, and not during query execution.

@nombre_de variable@variable_name
Es el nombre de una variable local que se utiliza en una consulta, a la que se puede asignar un valor para utilizarlo con la sugerencia 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
Indica al optimizador de consultas que use datos estadísticos en lugar del valor inicial para determinar el valor de una variable local durante la optimización de la 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
Es un valor constante literal al que se asigna @nombre_de variable para su uso con la sugerencia de consulta OPTIMIZE FOR.Is a literal constant value to be assigned @variable_name for use with the OPTIMIZE FOR query hint. constante_literal se usa solo durante la optimización de la consulta y no como el valor de @nombre_de variable durante la ejecución de la consulta.literal_constant is used only during query optimization, and not as the value of @variable_name during query execution. literal_constant puede tener cualquier tipo de datos de sistema de SQL ServerSQL Server que se pueda expresar como una constante literal.literal_constant can be of any SQL ServerSQL Server system data type that can be expressed as a literal constant. El tipo de datos de constante_literal se debe convertir de forma implícita al tipo de datos al que @nombre_de variable hace referencia en la consulta.The data type of literal_constant must be implicitly convertible to the data type that @variable_name references in the query.

OPTIMIZE FOR puede contrarrestar el comportamiento de detección de parámetros predeterminado del optimizador.OPTIMIZE FOR can counteract the optimizer's default parameter detection behavior. Use también OPTIMIZE FOR para crear guías de plan.Also use OPTIMIZE FOR when you create plan guides. Para más información, vea Volver a compilar un procedimiento almacenado.For more information, see Recompile a Stored Procedure.

OPTIMIZE FOR UNKNOWNOPTIMIZE FOR UNKNOWN
Indica al optimizador de consultas que use datos estadísticos en lugar de los valores iniciales para todas las variables locales al compilar y optimizar la consulta.Instructs the Query Optimizer to use statistical data instead of the initial values for all local variables when the query is compiled and optimized. Esta optimización incluye los parámetros creados mediante parametrización forzada.This optimization includes parameters created with forced parameterization.

Si usa OPTIMIZE FOR @variable_name = literal_constant y OPTIMIZE FOR UNKNOWN en la misma sugerencia de consulta, el optimizador de consultas usará el valor literal_constant especificado para un valor determinado.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. El optimizador de consultas usará UNKNOWN para los valores de las variables restantes.The Query Optimizer will use UNKNOWN for the rest of the variable values. Los valores se usan solo durante la optimización de la consulta y no durante la ejecución de la misma.The values are used only during query optimization, and not during query execution.

PARAMETERIZATION { SIMPLE | FORCED }PARAMETERIZATION { SIMPLE | FORCED }
Especifica las reglas de parametrización que aplica el optimizador de consultas de SQL ServerSQL Server cuando se compila la consulta.Specifies the parameterization rules that the SQL ServerSQL Server Query Optimizer applies to the query when it's compiled.

Importante

La sugerencia de consulta PARAMETERIZATION solo se puede especificar en una guía de plan para invalidar la configuración actual de la opción SET de base de datos PARAMETERIZATION.The PARAMETERIZATION query hint can only be specified inside a plan guide to override the current setting of the PARAMETERIZATION database SET option. No se puede especificar directamente en una consulta.It can't be specified directly within a query.
Para más información, vea Especificar el comportamiento de parametrización de consultas por medio de guías de plan.For more information, see Specify Query Parameterization Behavior by Using Plan Guides.

SIMPLE indica al optimizador de consultas que intente la parametrización simple.SIMPLE instructs the Query Optimizer to attempt simple parameterization. FORCED indica al optimizador de consultas que intente la parametrización forzada.FORCED instructs the Query Optimizer to attempt forced parameterization. Para más información, vea Parametrización forzada en la guía de arquitectura de procesamiento de consultas y Parametrización simple en la guía de arquitectura de procesamiento de consultas.For more information, see Forced Parameterization in the Query Processing Architecture Guide, and Simple Parameterization in the Query Processing Architecture Guide.

RECOMPILERECOMPILE
Indica a Motor de base de datos de SQL ServerSQL Server Database Engine que genere un plan nuevo y temporal para la consulta y descarte de inmediato ese plan una vez que se completa la ejecución de la consulta.Instructs the Motor de base de datos de SQL ServerSQL Server Database Engine to generate a new, temporary plan for the query and immediately discard that plan after the query completes execution. El plan de consulta generado no reemplaza un plan almacenado en caché cuando la misma consulta se ejecuta sin la sugerencia RECOMPILE.The generated query plan doesn't replace a plan stored in cache when the same query runs without the RECOMPILE hint. Sin especificar RECOMPILE, el Motor de base de datosDatabase Engine almacena en la memoria caché planes de consulta y los reutiliza.Without specifying RECOMPILE, the Motor de base de datosDatabase Engine caches query plans and reuses them. Al compilar los planes de consulta, la sugerencia de consulta RECOMPILE utiliza los valores actuales de cualquier variable local en la consulta.When compiling query plans, the RECOMPILE query hint uses the current values of any local variables in the query. Si la consulta está dentro de un procedimiento almacenado, los valores actuales se pasan a cualquier parámetro.If the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE es una alternativa útil a la creación de un procedimiento almacenado.RECOMPILE is a useful alternative to creating a stored procedure. RECOMPILE utiliza la cláusula WITH RECOMPILE cuando solo se debe volver a compilar un subconjunto de consultas del procedimiento almacenado, en lugar de todo el procedimiento almacenado.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 más información, vea Volver a compilar un procedimiento almacenado.For more information, see Recompile a Stored Procedure. RECOMPILE también es útil al crear guías de plan.RECOMPILE is also useful when you create plan guides.

ROBUST PLANROBUST PLAN
Fuerza al optimizador de consultas a intentar aplicar un plan que funcione para el tamaño máximo de fila posible en detrimento del rendimiento.Forces the Query Optimizer to try a plan that works for the maximum potential row size, possibly at the expense of performance. Cuando se procesa la consulta, es posible que las tablas intermedias y los operadores necesiten guardar y procesar filas más anchas que las filas de entrada cuando la consulta se procesa.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. Las filas pueden llegar a ser tan anchas que, en algunos casos, el operador especificado no puede procesar la fila.The rows may be so wide that, sometimes, the particular operator can't process the row. Si las filas son tan anchas, el Motor de base de datosDatabase Engine genera un error durante la ejecución de la consulta.If rows are that wide, the Motor de base de datosDatabase Engine produces an error during query execution. Mediante la utilización de ROBUST PLAN, puede indicar al optimizador de consultas que no tenga en cuenta los planes de consulta que puedan encontrarse con este problema.By using ROBUST PLAN, you instruct the Query Optimizer not to consider any query plans that may run into this problem.

Si no es posible realizar tal plan, el optimizador de consultas devuelve un error en lugar de diferir la detección de errores hasta la ejecución de la consulta.If such a plan isn't possible, the Query Optimizer returns an error instead of deferring error detection to query execution. Las filas pueden contener columnas de longitud variable; el Motor de base de datosDatabase Engine permite definir filas con un tamaño potencial máximo que supere la capacidad del Motor de base de datosDatabase Engine para procesarlas.Rows may contain variable-length columns; the Motor de base de datosDatabase Engine allows for rows to be defined that have a maximum potential size beyond the ability of the Motor de base de datosDatabase Engine to process them. Normalmente, a pesar del tamaño potencial máximo, una aplicación almacena filas cuyo tamaño real se encuentra dentro de los límites que puede procesar el Motor de base de datosDatabase Engine.Generally, despite the maximum potential size, an application stores rows that have actual sizes within the limits that the Motor de base de datosDatabase Engine can process. Si el Motor de base de datosDatabase Engine se encuentra con una fila demasiado larga, devuelve un error de ejecución.If the Motor de base de datosDatabase Engine comes across a row that is too long, an execution error is returned.

USE HINT ( ' hint_name ' )USE HINT ( 'hint_name' )
Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) and Base de datos SQL de AzureAzure SQL Database.

Proporciona una o varias sugerencias adicionales para el procesador de consultas.Provides one or more additional hints to the query processor. Las sugerencias adicionales se especifican mediante un nombre de la sugerencia dentro de comillas simples.The additional hints are specified by a hint name inside single quotation marks.

Se admiten los siguientes nombres de sugerencia:The following hint names are supported:

  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
    Hace que SQL ServerSQL Server genere un plan de consulta mediante la hipótesis de contención simple en lugar de la hipótesis de contención de base predeterminada para las combinaciones en el modelo de estimación de la cardinalidad de SQL Server 2014 (12.x)SQL Server 2014 (12.x) o versiones más recientes.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. Es equivalente a la marca de seguimiento 9476.This hint name is equivalent to trace flag 9476.

  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    Hace que SQL ServerSQL Server genere un plan con una selectividad mínima al estimar predicados AND para que los filtros tengan en cuenta la correlación.Causes SQL ServerSQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation. Es equivalente a la marca de seguimiento 4137 cuando se usa con el modelo de estimación de cardinalidad de SQL Server 2012 (11.x)SQL Server 2012 (11.x) y versiones anteriores, y tiene un efecto similar cuando se usa la marca de seguimiento 9471 con el modelo de estimación de cardinalidad de SQL Server 2014 (12.x)SQL Server 2014 (12.x) o versiones posteriores.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'
    Deshabilita las combinaciones adaptables del modo por lotes.Disables batch mode adaptive joins. Para obtener más información, vea Combinaciones adaptables del modo por lotes.For more information, see Batch mode Adaptive Joins.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2017 (14.x)SQL Server 2017 (14.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Base de datos SQL de AzureAzure SQL Database.

  • "DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK"'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
    Deshabilita los comentarios de concesión de memoria en modo por lotes.Disables batch mode memory grant feedback. Para obtener más información, vea Comentarios de concesión de memoria de modo de proceso por lotes.For more information, see Batch mode memory grant feedback.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2017 (14.x)SQL Server 2017 (14.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Base de datos SQL de AzureAzure SQL Database.

  • "DISABLE_DEFERRED_COMPILATION_TV"'DISABLE_DEFERRED_COMPILATION_TV'
    Deshabilita la compilación diferida de variables de tabla.Disables table variable deferred compilation. Para obtener más información, consulte Compilación diferida de variables de tabla.For more information, see Table variable deferred compilation.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2019 (15.x)SQL Server 2019 (15.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Base de datos SQL de AzureAzure SQL Database.

  • "DISABLE_INTERLEAVED_EXECUTION_TVF"'DISABLE_INTERLEAVED_EXECUTION_TVF'
    Deshabilita la ejecución intercalada de las funciones con valores de tabla de múltiples instrucciones.Disables interleaved execution for multi-statement table-valued functions. Para más información, consulte Ejecución intercalada de funciones con valores de tabla de múltiples instrucciones.For more information, see Interleaved execution for multi-statement table-valued functions.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2017 (14.x)SQL Server 2017 (14.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Base de datos SQL de AzureAzure SQL Database.

  • "DISABLE_OPTIMIZED_NESTED_LOOP"'DISABLE_OPTIMIZED_NESTED_LOOP'
    Indica al procesador de consultas que no use una operación de ordenación (ordenación por lotes) para las combinaciones de bucle anidado optimizadas cuando se genera un plan de consulta.Instructs the query processor not to use a sort operation (batch sort) for optimized nested loop joins when generating a query plan. Es equivalente a la marca de seguimiento 2340.This hint name is equivalent to trace flag 2340.

  • 'DISABLE_OPTIMIZER_ROWGOAL' 'DISABLE_OPTIMIZER_ROWGOAL'
    Hace que SQL Server genere un plan que no usa las modificaciones del objetivo de fila con las consultas que contienen estas palabras clave:Causes SQL Server to generate a plan that doesn't use row goal modifications with queries that contain these keywords:

    • ARRIBATOP
    • OPTION (FAST N)OPTION (FAST N)
    • ININ
    • EXISTSEXISTS

    Es equivalente a la marca de seguimiento 4138.This hint name is equivalent to trace flag 4138.

  • "DISABLE_PARAMETER_SNIFFING"'DISABLE_PARAMETER_SNIFFING'
    Indica al optimizador de consultas que utilice el promedio de distribución de datos al compilar una consulta con uno o más parámetros.Instructs Query Optimizer to use average data distribution while compiling a query with one or more parameters. Esta instrucción hace que el plan de consulta sea independiente en el valor del parámetro que se utilizó en primer lugar cuando se compiló la consulta.This instruction makes the query plan independent on the parameter value that was first used when the query was compiled. Es equivalente a la marca de seguimiento 4136 o a la opción PARAMETER_SNIFFING = OFF de Configuración de ámbito de base de datos.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'
    Deshabilita los comentarios de concesión de memoria del modo de fila.Disables row mode memory grant feedback. Para más información, consulte Comentarios de concesión de memoria de modo de proceso por lotes.For more information, see Row mode memory grant feedback.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2019 (15.x)SQL Server 2019 (15.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Base de datos SQL de AzureAzure SQL Database.

  • "DISABLE_TSQL_SCALAR_UDF_INLINING"'DISABLE_TSQL_SCALAR_UDF_INLINING'
    Deshabilita la inserción de UDF escalar.Disables scalar UDF inlining. Para obtener más información, vea Scalar UDF inlining (Inserción de UDF escalar).For more information, see Scalar UDF Inlining.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2019 (15.x)SQL Server 2019 (15.x)).Applies to: SQL ServerSQL Server (starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)).

  • "DISALLOW_BATCH_MODE"'DISALLOW_BATCH_MODE'
    Deshabilita la ejecución del modo por lotes.Disables batch mode execution. Para más información, consulte Modos de ejecución.For more information, see Execution modes.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2017 (14.x)SQL Server 2017 (14.x)) y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Base de datos SQL de AzureAzure SQL Database.

  • "ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS"'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
    Habilita las estadísticas rápidas generadas automáticamente (modificación de histograma) para las columnas de índice iniciales para las que se necesite la estimación de cardinalidad.Enables automatically generated quick statistics (histogram amendment) for any leading index column for which cardinality estimation is needed. El histograma usado para calcular la cardinalidad se ajustará en tiempo de compilación de la consulta para tener en cuenta el valor máximo o mínimo real de esta columna.The histogram used to estimate cardinality will be adjusted at query compile time to account for actual maximum or minimum value of this column. Es equivalente a la marca de seguimiento 4139.This hint name is equivalent to trace flag 4139.

  • "ENABLE_QUERY_OPTIMIZER_HOTFIXES"'ENABLE_QUERY_OPTIMIZER_HOTFIXES'
    Permite revisiones del optimizador de consultas (cambios publicados en las actualizaciones acumulativas y Service Packs de SQL Server).Enables Query Optimizer hotfixes (changes released in SQL Server Cumulative Updates and Service Packs). Es equivalente a la marca de seguimiento 4199 o a la opción QUERY_OPTIMIZER_HOTFIXES = ON de Configuración de ámbito de base de datos.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'
    Fuerza al optimizador de consultas a usar el modelo de estimación de la cardinalidad que se corresponde con el nivel de compatibilidad de la base de datos actual.Forces the Query Optimizer to use Cardinality Estimation model that corresponds to the current database compatibility level. Use esta sugerencia para invalidar la opción LEGACY_CARDINALITY_ESTIMATION = ON de Configuración de ámbito de base de datos o la marca de seguimiento 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'
    Fuerza al optimizador de consultas a usar el modelo de estimación de la cardinalidad de SQL Server 2012 (11.x)SQL Server 2012 (11.x) y versiones anteriores.Forces the Query Optimizer to use Cardinality Estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions. Es equivalente a la marca de seguimiento 9481 o a la opción LEGACY_CARDINALITY_ESTIMATION = ON de Configuración de ámbito de base de datos.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'
    Fuerza el comportamiento del optimizador de consultas en un nivel de consulta.Forces the Query Optimizer behavior at a query level. Este comportamiento se produce como si la consulta se compilara con nivel de compatibilidad de base de datos n, donde n es un nivel de compatibilidad de base de datos compatible.This behavior happens as if the query was compiled with database compatibility level n, where n is a supported database compatibility level. Consulte sys.dm_exec_valid_use_hints para ver una lista de los valores admitidos actualmente para n.Refer to sys.dm_exec_valid_use_hints for a list of currently supported values for n.
    Se aplica a: SQL ServerSQL Server (a partir de 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).

    Nota

    La sugerencia QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n no invalida la configuración de la estimación de cardinalidad heredada o predeterminada, si se fuerza a través de la configuración con ámbito de base de datos, marca de seguimiento u otra sugerencia 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.
    Esta sugerencia solo afecta al comportamiento del optimizador de consultas.This hint only affects the behavior of the Query Optimizer. No afecta a otras características de SQL ServerSQL Server que pueden depender del nivel de compatibilidad de base de datos, como la disponibilidad de determinadas características de base de datos.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 más información sobre esta sugerencia, vea Developer's Choice: Hinting Query Execution model (Elección del desarrollador: modelo de ejecución de consultas de sugerencias).To learn more about this hint, see Developer's Choice: Hinting Query Execution model.

  • 'QUERY_PLAN_PROFILE''QUERY_PLAN_PROFILE'
    Habilita la generación de perfiles ligera para la consulta.Enables lightweight profiling for the query. Cuando finaliza una consulta que contiene esta nueva sugerencia, se activa un nuevo evento extendido: query_plan_profile.When a query that contains this new hint finishes, a new Extended Event, query_plan_profile, is fired. Este evento extendido expone las estadísticas de ejecución y el plan de ejecución real XML similar al evento extendido query_post_execution_showplan, pero solo para las consultas que contiene la nueva sugerencia.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.
    Se aplica a: SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 CU3 y 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).

    Nota

    Si habilita la recopilación del evento extendido query_post_execution_showplan, se agregará la infraestructura de generación de perfiles estándar para todas las consultas que se están ejecutando en el servidor, por lo que podría resultar afectado el rendimiento global del 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.
    Si habilita la recopilación del evento extendido query_thread_profile para usar en su lugar la generación de perfiles ligera, habrá una sobrecarga de rendimiento mucho mejor, pero seguirá resultando afectado el rendimiento global del 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.
    Si habilita el evento extendido query_plan_profile, solo se habilitará la infraestructura ligera de generación de perfiles para una consulta que se ejecutó con QUERY_PLAN_PROFILE, con lo que las otras cargas de trabajo del servidor no resultarán afectadas.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 esta sugerencia para generar perfiles de una consulta específica sin que esto afecte a otras partes de la carga de trabajo del servidor.Use this hint to profile a specific query without affecting other parts of the server workload. Para más información sobre la generación de perfiles de baja intensidad, vea Infraestructura de generación de perfiles de consultas.To learn more about lightweight profiling, see Query Profiling Infrastructure.

Puede consultar la lista de todos los nombres de USE HINT compatibles mediante la vista de administración dinámica 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.

Sugerencia

Los nombres de sugerencia no distinguen mayúsculas de minúsculas.Hint names are case-insensitive.

Importante

Algunas sugerencias USE HINT pueden entrar en conflicto con las marcas de seguimiento habilitadas a nivel global o de sesión, o con las opciones de configuración con ámbito de base de datos.Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings. En este caso, la sugerencia de nivel de consulta (USE HINT) siempre tiene prioridad.In this case, the query level hint (USE HINT) always takes precedence. Si una sugerencia USE HINT entra en conflicto con otra sugerencia de consulta o una marca de seguimiento habilitada en el nivel de consulta (por ejemplo, mediante QUERYTRACEON), SQL ServerSQL Server generará un error al intentar ejecutar la 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'
Fuerza al optimizador de consultas a usar un plan de consulta existente en una 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 no puede especificarse con las instrucciones INSERT, UPDATE, MERGE ni DELETE.USE PLAN cannot be specified with INSERT, UPDATE, MERGE, or DELETE statements.

TABLE HINT ( exposed_object_name [ , <table_hint> [ [ , ]...n ] ] ) Aplica la sugerencia de la tabla especificada a la tabla o vista que corresponde 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. Se recomienda usar una sugerencia de tabla como una sugerencia de consulta únicamente en el contexto de una guía de plan.We recommend using a table hint as a query hint only in the context of a plan guide.

exposed_object_name puede ser una de las referencias siguientes:exposed_object_name can be one of the following references:

  • Cuando se usa un alias para la tabla o vista en la cláusula FROM de la consulta, el alias es exposed_object_name.When an alias is used for the table or view in the FROM clause of the query, exposed_object_name is the alias.

  • Cuando no se usa un alias, exposed_object_name es la coincidencia exacta de la tabla o vista a la que se hace referencia en la 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 ejemplo, si se hace referencia a la tabla o vista con un nombre de dos partes, exposed_object_name es el mismo nombre de dos partes.For example, if the table or view is referenced using a two-part name, exposed_object_name is the same two-part name.

Al especificar exposed_object_name sin especificar también una sugerencia de tabla, se descartan todos los índices que especifique en la consulta como parte de una sugerencia de tabla para el objeto.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. Después, el optimizador de consultas determina el uso de los índices.The Query Optimizer then determines index usage. Puede emplear esta técnica para eliminar el efecto de una sugerencia de tabla INDEX cuando no se puede modificar la consulta original.You can use this technique to eliminate the effect of an INDEX table hint when you can't modify the original query. Vea el ejemplo 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 } Es la sugerencia de tabla que se aplica a la tabla o vista que corresponde a exposed_object_name como una sugerencia 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 obtener una descripción de estas sugerencias, vea Sugerencias de tabla (Transact-SQL).For a description of these hints, see Table Hints (Transact-SQL).

Las sugerencias de tabla distintas de INDEX, FORCESCAN y FORCESEEK no están permitidas como sugerencias de consulta, a menos que la consulta ya tenga una cláusula WITH que especifique la sugerencia de tabla.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 obtener más información, vea la sección Comentarios.For more information, see Remarks.

Precaución

Al especificar FORCESEEK con parámetros se limita el número de planes que el optimizador puede considerar en comparación con cuando se especifica FORCESEEK sin 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. Esto puede producir un error "No se puede generar el plan" en más casos.This may cause a "Plan cannot be generated" error to occur in more cases. En una versión futura, las modificaciones internas realizadas en el optimizador pueden permitir que se consideren más planes.In a future release, internal modifications to the optimizer may allow more plans to be considered.

NotasRemarks

No se pueden especificar sugerencias de consulta en una instrucción INSERT, excepto cuando se usa una cláusula SELECT en la instrucción.Query hints cannot be specified in an INSERT statement, except when a SELECT clause is used inside the statement.

Solo se pueden especificar sugerencias de consulta en la consulta de nivel superior, no en las subconsultas.Query hints can be specified only in the top-level query, not in subqueries. Cuando se especifica una sugerencia de tabla como una sugerencia de consulta, la sugerencia puede especificarse en la consulta de nivel superior o en una 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. Sin embargo, el valor especificado para exposed_object_name en la cláusula TABLE HINT debe coincidir exactamente con el nombre expuesto en la consulta o 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.

Especificar sugerencias de tabla como sugerencias de consultaSpecifying Table Hints as Query Hints

Se recomienda usar la sugerencia de tabla INDEX, FORCESCAN o FORCESEEK como sugerencia de consulta únicamente en el contexto de una guía de plan.We recommend using the INDEX, FORCESCAN, or FORCESEEK table hint as a query hint only in the context of a plan guide. Las guías de plan son útiles cuando no se puede modificar la consulta original, por ejemplo, porque es una aplicación de otro fabricante.Plan guides are useful when you can't modify the original query, for example, because it's a third-party application. La sugerencia de consulta especificada en la guía de plan se agrega a la consulta antes de compilarla y optimizarla.The query hint specified in the plan guide is added to the query before it's compiled and optimized. Para las consultas ad hoc, utilice la cláusula TABLE HINT únicamente en las pruebas de instrucciones de guías de plan.For ad-hoc queries, use the TABLE HINT clause only when testing plan guide statements. Para todas las demás consultas ad hoc, se recomienda especificar estas sugerencias únicamente como sugerencias de tabla.For all other ad-hoc queries, we recommend specifying these hints only as table hints.

Cuando se especifican como una sugerencia de consulta, las sugerencias de tabla INDEX, FORCESCAN y FORCESEEK son válidas para los objetos siguientes:When specified as a query hint, the INDEX, FORCESCAN, and FORCESEEK table hints are valid for the following objects:

  • TablasTables
  • VistasViews
  • Vistas indizadasIndexed views
  • Expresiones de tabla comunes (la sugerencia se debe especificar en la instrucción SELECT cuyo conjunto de resultados rellena la expresión de tabla común)Common table expressions (the hint must be specified in the SELECT statement whose result set populates the common table expression)
  • Vistas de administración dinámicaDynamic management views
  • Subconsultas con nombreNamed subqueries

Puede especificar las sugerencias de tabla INDEX, FORCESCAN, y FORCESEEK como sugerencias de consulta para una consulta que no tenga ninguna sugerencia de tabla existente.You can specify INDEX, FORCESCAN, and FORCESEEK table hints as query hints for a query that doesn't have any existing table hints. También puede utilizarlas para reemplazar las sugerencias INDEX, FORCESCAN o FORCESEEK existentes en la consulta, respectivamente.You can also use them to replace existing INDEX, FORCESCAN, or FORCESEEK hints in the query, respectively.

Las sugerencias de tabla distintas de INDEX, FORCESCAN y FORCESEEK no están permitidas como sugerencias de consulta, a menos que la consulta ya tenga una cláusula WITH que especifique la sugerencia de tabla.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. En este caso, también debe especificarse una sugerencia coincidente como sugerencia de consulta.In this case, a matching hint must also be specified as a query hint. Especifique la sugerencia coincidente como sugerencia de consulta mediante TABLE HINT en la cláusula OPTION.Specify the matching hint as a query hint by using TABLE HINT in the OPTION clause. Esta especificación conserva la semántica de la consulta.This specification preserves the query's semantics. Por ejemplo, si la consulta contiene la sugerencia de tabla NOLOCK, la cláusula OPTION del parámetro @hints de la guía de plan también debe contener la sugerencia 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. Vea el ejemplo K.See Example K.

Se produce el error 8072 en un par de escenarios.Error 8072 occurs in a couple of scenarios. Uno es cuando especifica una sugerencia de tabla distinta de INDEX, FORCESCAN o FORCESEEK mediante TABLE HINT en la cláusula OPTION sin una sugerencia de consulta coincidente.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. El segundo escenario es al revés.The second scenario is the other way around. Este error indica que la cláusula OPTION puede hacer que la semántica de la consulta cambie y se produzca un error en la consulta.This error indicates the OPTION clause can cause the semantics of the query to change, and the query fails.

EjemplosExamples

A.A. Usar MERGE JOINUsing MERGE JOIN

En el siguiente ejemplo se especifica que una combinación MERGE JOIN ejecuta la operación JOIN de la consulta.The following example specifies that MERGE JOIN runs the JOIN operation in the query. En el ejemplo se usa la base de datos 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. Usar OPTIMIZE FORUsing OPTIMIZE FOR

En el ejemplo siguiente se indica al optimizador de consultas que use el valor 'Seattle'para la variable local @city_name y que use datos estadísticos para determinar el valor de la variable local @postal_code al optimizar la 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. En el ejemplo se usa la base de datos 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. Usar MAXRECURSIONUsing MAXRECURSION

MAXRECURSION se puede utilizar para impedir que una expresión de tabla común recursiva con formato incorrecto entre en un bucle infinito.MAXRECURSION can be used to prevent a poorly formed recursive common table expression from entering into an infinite loop. En el ejemplo siguiente se crea un bucle infinito intencionadamente y se usa la sugerencia MAXRECURSION para limitar el número de niveles de recursividad a dos.The following example intentionally creates an infinite loop and uses the MAXRECURSION hint to limit the number of recursion levels to two. En el ejemplo se usa la base de datos 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  

Después de corregir el error de código, ya no se requiere MAXRECURSION.After the coding error is corrected, MAXRECURSION is no longer required.

D.D. Usar MERGE UNIONUsing MERGE UNION

En el ejemplo siguiente se usa la sugerencia de consulta MERGE UNION.The following example uses the MERGE UNION query hint. En el ejemplo se usa la base de datos 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. Usar HASH GROUP y FASTUsing HASH GROUP and FAST

En el ejemplo siguiente se usan las sugerencias de consulta HASH GROUP y FAST.The following example uses the HASH GROUP and FAST query hints. En el ejemplo se usa la base de datos 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. Usar MAXDOPUsing MAXDOP

En el ejemplo siguiente se usa la sugerencia de consulta MAXDOP.The following example uses the MAXDOP query hint. En el ejemplo se usa la base de datos 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 (MAXDOP 2);    
GO

G.G. Usar INDEXUsing INDEX

Los ejemplos siguientes usan la sugerencia INDEX.The following examples use the INDEX hint. El primer ejemplo especifica un índice único.The first example specifies a single index. El segundo ejemplo especifica varios índices para obtener una única referencia de tabla.The second example specifies multiple indexes for a single table reference. En ambos ejemplos, como la sugerencia INDEX se aplica en una tabla que usa un alias, la cláusula TABLE HINT también debe especificar el mismo alias que el nombre del objeto expuesto.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. En el ejemplo se usa la base de datos 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. Usar FORCESEEKUsing FORCESEEK

En el siguiente ejemplo se utiliza la sugerencia de tabla FORCESEEK.The following example uses the FORCESEEK table hint. La cláusula TABLE HINT también debe especificar el mismo nombre de dos partes como el nombre del objeto expuesto.The TABLE HINT clause must also specify the same two-part name as the exposed object name. Especifique el nombre cuando aplique la sugerencia INDEX en una tabla que usa un nombre de dos partes.Specify the name when you apply the INDEX hint on a table that uses a two-part name. En el ejemplo se usa la base de datos 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. Usar varias sugerencias de tablaUsing multiple table hints

El ejemplo siguiente aplica la sugerencia INDEX a una tabla y la sugerencia FORCESEEK a otra.The following example applies the INDEX hint to one table and the FORCESEEK hint to another. En el ejemplo se usa la base de datos 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. Usar TABLE HINT para invalidar una sugerencia de tabla existenteUsing TABLE HINT to override an existing table hint

En el ejemplo siguiente se muestra cómo usar la sugerencia TABLE HINT.The following example shows how to use the TABLE HINT hint. Puede usar la sugerencia sin especificar una sugerencia para invalidar el comportamiento de sugerencia de tabla INDEX que especifica en la cláusula FROM de la 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. En el ejemplo se usa la base de datos 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. Especificar sugerencias de tabla que afectan a la semánticaSpecifying semantics-affecting table hints

El ejemplo siguiente presenta dos sugerencias de tabla en la consulta: NOLOCK, que afecta a la semántica, e INDEX, que no la afecta.The following example contains two table hints in the query: NOLOCK, which is semantic-affecting, and INDEX, which is non-semantic-affecting. Para conservar la semántica de la consulta, la sugerencia NOLOCK se especifica en la cláusula OPTIONS de la guía de plan.To preserve the semantics of the query, the NOLOCK hint is specified in the OPTIONS clause of the plan guide. Junto con la sugerencia NOLOCK, especifique las sugerencias INDEX y FORCESEEK y reemplace la sugerencia INDEX que no afecta a la semántica en la consulta durante la compilación y optimización de la instrucción.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. En el ejemplo se usa la base de datos 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    

El ejemplo siguiente muestra un método alternativo para conservar la semántica de la consulta y permitir al optimizador elegir un índice distinto del índice que se especificó en la sugerencia de tabla.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 el optimizador elija especificando la sugerencia NOLOCK en la cláusula OPTIONS.Allow the optimizer to choose by specifying the NOLOCK hint in the OPTIONS clause. Especifique la sugerencia porque afecta a la semántica.You specify the hint because it's semantic-affecting. A continuación, especifique la palabra clave TABLE HINT con solo una referencia de tabla y ninguna sugerencia INDEX.Then, specify the TABLE HINT keyword with only a table reference and no INDEX hint. En el ejemplo se usa la base de datos 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. Usar la sugerencia USE HINTUsing USE HINT

En el ejemplo siguiente se usan las sugerencias de consulta RECOMPILE y USE HINT.The following example uses the RECOMPILE and USE HINT query hints. En el ejemplo se usa la base de datos AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

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 tambiénSee 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)
Marcas de seguimiento Trace Flags
Convenciones de sintaxis de Transact-SQLTransact-SQL Syntax Conventions