Указания (Transact-SQL) — запросыHints (Transact-SQL) - Query

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Подсказки в запросе указывают, что для запроса должна использоваться заданная подсказка.Query hints specify that the indicated hints should be used throughout the query. Они влияют на все операторы в инструкции.They affect all operators in the statement. Если в основном запросе используется операция UNION, только последний запрос, использующий ее, может содержать предложение OPTION.If UNION is involved in the main query, only the last query involving a UNION operation can have the OPTION clause. Подсказки в запросе указываются как часть предложения OPTION.Query hints are specified as part of the OPTION clause. Если оптимизатор запросов не сформирует допустимый план из-за одного или нескольких указаний запроса, возникает ошибка 8622.Error 8622 occurs if one or more query hints cause the query optimizer not to generate a valid plan.

Внимание!

Поскольку оптимизатор запросов SQL ServerSQL Server обычно выбирает лучший план выполнения запроса, использовать подсказки рекомендуется только опытным разработчикам и администраторам баз данных в самом крайнем случае.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.

Применимо к:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

СинтаксисSyntax

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

АргументыArguments

{ HASH |ORDER } GROUP{ HASH | ORDER } GROUP
Указывает, что агрегаты, описываемые в предложениях GROUP BY или DISTINCT в запросе, должны использовать хэширование или упорядочивание.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
Указывает, что все операции UNION выполняются путем слияния, хэширования или объединения наборов UNION.Specifies that all UNION operations are run by merging, hashing, or concatenating UNION sets. Если задано несколько указаний UNION, оптимизатор запросов выбирает наименее затратную стратегию из указанных.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
Указывает, что все операции соединения во всем запросе выполняются с помощью LOOP JOIN, MERGE JOIN или HASH JOIN.Specifies all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. Если задано больше одного указания соединения, оптимизатор запросов выбирает наименее затратную стратегию из допустимых.If you specify more than one join hint, the optimizer selects the least expensive join strategy from the allowed ones.

Если в предложении FROM для определенной пары таблиц в том же запросе есть указание соединения, оно имеет приоритет при соединении двух таблиц.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. Но указания запроса при этом все равно должны соблюдаться.The query hints, though, must still be honored. Указание соединения для пары таблиц может только ограничивать выбор методов соединения, разрешенных в указании запроса.The join hint for the pair of tables may only restrict the selection of allowed join methods in the query hint. Дополнительные сведения см. в разделе Указания соединений (Transact-SQL).For more information, see Join Hints (Transact-SQL).

EXPAND VIEWSEXPAND VIEWS
Указывает, что индексированные представления разворачиваются.Specifies the indexed views are expanded. Также указывает, что оптимизатор запросов не будет рассматривать индексированные представления в качестве замены для любой части запроса.Also specifies the query optimizer won't consider any indexed view as a replacement for any query part. Представление разворачивается при замене имени представления на определение представления в тексте запроса.A view is expanded when the view definition replaces the view name in the query text.

Это указание запроса виртуально запрещает прямое использование индексированных представлений и индексов для индексированных представлений в плане запроса.This query hint virtually disallows direct use of indexed views and indexes on indexed views in the query plan.

Индексированное представление сохраняет сокращенный вид, если на это представление есть прямая ссылка в части SELECT запроса.The indexed view remains condensed if there's a direct reference to the view in the query's SELECT part. Представление также останется сокращенным, если указаны предложения WITH (NOEXPAND) или WITH (NOEXPAND, INDEX(index_value_ [ , ...n ] ) ).The view also remains condensed if you specify WITH (NOEXPAND) or WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) ). Дополнительные сведения об указании запроса NOEXPAND см. в разделе Использование NOEXPAND.For more information about the query hint NOEXPAND, see Using NOEXPAND.

Это указание действует только на представления в части SELECT инструкции, в том числе в инструкциях INSERT, UPDATE, MERGE и 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
Указывает, что запрос оптимизирован для быстрого получения первых n строк (number_rows).Specifies that the query is optimized for fast retrieval of the first number_rows. Это неотрицательное целое число.This result is a nonnegative integer. После возвращения первых n строк (number_rows) запрос продолжает выполняться и возвращает полный результирующий набор.After the first number_rows are returned, the query continues execution and produces its full result set.

FORCE ORDERFORCE ORDER
Указывает, что при оптимизации запроса сохраняется порядок соединения, заданный синтаксисом запроса.Specifies that the join order indicated by the query syntax is preserved during query optimization. Использование FORCE ORDER не влияет на возможный реверс ролей в оптимизаторе запросов.Using FORCE ORDER doesn't affect possible role reversal behavior of the query optimizer.

Примечание

Инструкция MERGE получает доступ вначале к исходной таблице, затем к целевой в порядке соединения, принятом по умолчанию, если не задано предложение 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. Если указать FORCE ORDER, сохраняется поведение по умолчанию.Specifying FORCE ORDER preserves this default behavior.

{ FORCE | DISABLE } EXTERNALPUSHDOWN{ FORCE | DISABLE } EXTERNALPUSHDOWN
Принудительная передача или отключение передачи вычислений соответствующих выражений в Hadoop.Force or disable the pushdown of the computation of qualifying expressions in Hadoop. Применяется только к запросам, использующим PolyBase.Only applies to queries using PolyBase. Не выполняет отправку в хранилище Azure.Won't push down to Azure storage.

KEEP PLANKEEP PLAN
Заставляет оптимизатор запросов снизить приблизительный порог повторной компиляции для запроса.Forces the query optimizer to relax the estimated recompile threshold for a query. Предполагаемое пороговое значение повторной компиляции запускает автоматическую перекомпиляцию запроса, если в таблице изменилось ожидаемое количество индексированных столбцов при выполнении одной из следующих инструкций.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

Указание KEEP PLAN гарантирует, что запрос не будет часто перекомпилироваться при выполнении множественных обновлений в таблице.Specifying KEEP PLAN makes sure a query won't be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
Принуждает оптимизатор запросов не перекомпилировать запрос при изменении статистики.Forces the query optimizer not to recompile a query because of changes in statistics. Указание KEEPFIXED PLAN гарантирует, что запрос будет перекомпилирован только при изменении схемы базовых таблиц или при выполнении для них процедуры sp_recompile.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
Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

Предотвращает использование в запросе некластеризованного индекса columnstore с оптимизацией для памяти.Prevents the query from using a nonclustered memory optimized columnstore index. Если в запросе содержится указание запроса, исключающее использование индекса columnstore, а также указание индекса для использования индекса columnstore, то данные указания будут конфликтовать между собой, и запрос вернет ошибку.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
Максимальный объем предоставленной памяти в PERCENT.The maximum memory grant size in PERCENT. Запрос гарантированно не превышает это ограничение.The query is guaranteed not to exceed this limit. Реальное ограничение может быть ниже, если значение параметра Resource Governor ниже значения в этом указании.The actual limit can be lower if the Resource Governor setting is lower than the value specified by this hint. Допустимые значения — от 0 до 100.Valid values are between 0.0 and 100.0.

Применимо к: с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до 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
Минимальный размер предоставления памяти в PERCENT = % от ограничения по умолчанию.The minimum memory grant size in PERCENT = % of default limit. Запрос гарантированно получает MAX(required memory, min grant), поскольку для запуска запроса требуется по меньшей мере необходимый объем памяти.The query is guaranteed to get MAX(required memory, min grant) because at least required memory is needed to start a query. Допустимые значения — от 0 до 100.Valid values are between 0.0 and 100.0.

Применимо к: с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до 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
Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Переопределяет параметр конфигурации, задающий максимальный уровень параллелизма, в sp_configure.Overrides the max degree of parallelism configuration option of sp_configure. Также переопределяет Resource Governor для запроса, в котором указан этот параметр.Also overrides the Resource Governor for the query specifying this option. Указание запроса MAXDOP может превысить значение, настроенное с помощью sp_configure.The MAXDOP query hint can exceed the value configured with sp_configure. Если MAXDOP превышает значение, настроенное с помощью Resource Governor, компонент Компонент Database EngineDatabase Engine использует значение MAXDOP из Resource Governor, как описано в статье ALTER WORKLOAD GROUP (Transact-SQL).If MAXDOP exceeds the value configured with Resource Governor, the Компонент Database EngineDatabase Engine uses the Resource Governor MAXDOP value, described in ALTER WORKLOAD GROUP (Transact-SQL). Все семантические правила, используемые параметром конфигурации max degree of parallelism, применимы при использовании подсказки в запросе MAXDOP.All semantic rules used with the max degree of parallelism configuration option are applicable when you use the MAXDOP query hint. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option.

Предупреждение

Если значение MAXDOP равно нулю, сервер выбирает максимальную степень параллелизма.If MAXDOP is set to zero, then the server chooses the max degree of parallelism.

MAXRECURSION number MAXRECURSION number
Указывает максимальное число рекурсий, допустимых для данного запроса.Specifies the maximum number of recursions allowed for this query. number представляет собой неотрицательное целое число от 0 до 32 767.number is a nonnegative integer between 0 and 32,767. Если указано значение 0, ограничения не применяются.When 0 is specified, no limit is applied. Если этот параметр не указан, для сервера используется ограничение по умолчанию 100.If this option isn't specified, the default limit for the server is 100.

Если в процессе выполнения запроса достигнут указанный уровень MAXRECURSION (или уровень по умолчанию), выполнение запроса завершается и возвращается ошибка.When the specified or default number for MAXRECURSION limit is reached during query execution, the query ends and an error returns.

Из-за этой ошибки все действия инструкции откатываются.Because of this error, all effects of the statement are rolled back. Если это инструкция SELECT, может быть возвращена часть результатов или не возвращено ничего.If the statement is a SELECT statement, partial results or no results may be returned. Любые возвращенные частичные результаты могут не включать всех строк на рекурсивных уровнях, расположенных за указанным максимальным уровнем рекурсии.Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.

Дополнительные сведения см. в разделе WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

NO_PERFORMANCE_SPOOLNO_PERFORMANCE_SPOOL
Применимо к: с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до SQL Server 2017SQL Server 2017.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

Запрещает добавление оператора очередей в планы запроса (за исключением тех планов, когда очередь необходима для гарантированного обеспечения допустимой семантики обновления).Prevents a spool operator from being added to query plans (except for the plans when spool is required to guarantee valid update semantics). В некоторых сценариях оператор очередей может снизить производительность.The spool operator may reduce performance in some scenarios. Например, очередь использует базу данных tempdb, и за нее может возникнуть состязание при наличии множества параллельных запросов, выполняющихся с операциями очереди.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 ] )
Указывает оптимизатору запросов, что при компиляции и оптимизации запросов нужно использовать конкретное значение для локальной переменной.Instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. Значение используется только в процессе оптимизации запроса, но не в процессе выполнения.The value is used only during query optimization, and not during query execution.

@variable\_name_@variable\_name_
Имя локальной переменной, используемой в запросе, которой может быть присвоено значение для использования с указанием запроса 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
Указывает, что оптимизатор запросов использует статистические данные вместо начального значения, чтобы определить значение локальной переменной при оптимизации запросов.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
Значению литеральной константы присваивается имя _@variable\_name_ для использования в указании запроса OPTIMIZE FOR.Is a literal constant value to be assigned _@variable\_name_ for use with the OPTIMIZE FOR query hint. literal_constant используется только в процессе оптимизации запроса, а не как значение _@variable\_name_ во время выполнения запроса.literal_constant is used only during query optimization, and not as the value of _@variable\_name_ during query execution. literal_constant может иметь любой системный тип данных SQL ServerSQL Server, который может быть выражен как литеральная константа.literal_constant can be of any SQL ServerSQL Server system data type that can be expressed as a literal constant. Тип данных значения literal_constant должен неявно преобразовываться в тип данных, на который ссылается аргумент _@variable\_name_ в запросе.The data type of literal_constant must be implicitly convertible to the data type that _@variable\_name_ references in the query.

Указание OPTIMIZE FOR может изменить поведение оптимизатора по обнаружению параметра по умолчанию.OPTIMIZE FOR can counteract the optimizer's default parameter detection behavior. При создании структур плана также используйте OPTIMIZE FOR.Also use OPTIMIZE FOR when you create plan guides. Дополнительные сведения см. в разделе Перекомпиляция хранимой процедуры.For more information, see Recompile a Stored Procedure.

OPTIMIZE FOR UNKNOWNOPTIMIZE FOR UNKNOWN
Предписывает оптимизатору запросов использовать статистические данные вместо начальных значений для всех локальных переменных при компиляции и оптимизации запроса.Instructs the query optimizer to use statistical data instead of the initial values for all local variables when the query is compiled and optimized. Эта оптимизация включает параметры, созданные с принудительной параметризацией.This optimization includes parameters created with forced parameterization.

Если вы используете OPTIMIZE FOR @variable_name = literal_constant и OPTIMIZE FOR UNKNOWN в одном указании запроса, оптимизатор запросов будет использовать указанный аргумент literal_constant для конкретного значения.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. Для всех остальных значений переменной оптимизатор запросов будет использовать вариант UNKNOWN.The query optimizer will use UNKNOWN for the rest of the variable values. Значения используются только в процессе оптимизации запроса, но не в процессе выполнения.The values are used only during query optimization, and not during query execution.

PARAMETERIZATION { SIMPLE | FORCED }PARAMETERIZATION { SIMPLE | FORCED }
Указывает правила параметризации, которые оптимизатор запросов SQL ServerSQL Server применяет к запросу при его компиляции.Specifies the parameterization rules that the SQL ServerSQL Server query optimizer applies to the query when it's compiled.

Важно!

Указание запроса PARAMETERIZATION может быть задано только в структуре плана для переопределения текущего значения параметра SET базы данных PARAMETERIZATION.The PARAMETERIZATION query hint can only be specified inside a plan guide to override the current setting of the PARAMETERIZATION database SET option. Оно не может быть определено напрямую в запросе.It can't be specified directly within a query.
Дополнительные сведения см. в разделе Указание механизма параметризации запросов с помощью структур плана.For more information, see Specify Query Parameterization Behavior by Using Plan Guides.

Значение SIMPLE дает оптимизатору запросов указание использовать простую параметризацию.SIMPLE instructs the query optimizer to attempt simple parameterization. Значение FORCED предписывает оптимизатору запросов использовать принудительную параметризацию.FORCED instructs the query optimizer to attempt forced parameterization. Дополнительные сведения см. в разделах Принудительная параметризация и Простая параметризация в руководстве по архитектуре обработки запросов.For more information, see Forced Parameterization in the Query Processing Architecture Guide, and Simple Parameterization in the Query Processing Architecture Guide.

RECOMPILERECOMPILE
Указывает Компонент SQL Server Database EngineSQL Server Database Engine создать временный план для запроса, который будет немедленного удален после выполнения запроса.Instructs the Компонент SQL Server Database EngineSQL Server Database Engine to generate a new, temporary plan for the query and immediately discard that plan after the query completes execution. Созданный план запроса не заменяет план, хранимый в кэше, когда тот же запрос выполняется без указания RECOMPILE.The generated query plan doesn't replace a plan stored in cache when the same query runs without the RECOMPILE hint. Без указания подсказки RECOMPILE компонент Компонент Database EngineDatabase Engine кэширует планы запросов и использует их повторно.Without specifying RECOMPILE, the Компонент Database EngineDatabase Engine caches query plans and reuses them. При компиляции планов запроса указание запроса RECOMPILE использует в запросе текущие значения локальных переменных.When compiling query plans, the RECOMPILE query hint uses the current values of any local variables in the query. Если запрос находится в хранимой процедуре, всем параметрам присваиваются текущие значения.If the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE — полезная альтернатива созданию хранимой процедуры.RECOMPILE is a useful alternative to creating a stored procedure. RECOMPILE использует предложение WITH RECOMPILE в тех случаях, когда нужно перекомпилировать лишь часть запросов в хранимой процедуре, а не всю хранимую процедуру.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. Дополнительные сведения см. в разделе Перекомпиляция хранимой процедуры.For more information, see Recompile a Stored Procedure. Подсказка RECOMPILE также полезна для создания структур планов.RECOMPILE is also useful when you create plan guides.

ROBUST PLANROBUST PLAN
Заставляет оптимизатор запросов использовать план, который работает со строками наибольшего потенциального размера, возможно, с потерей производительности.Forces the query optimizer to try a plan that works for the maximum potential row size, possibly at the expense of performance. При обработке запроса промежуточным таблицам и операторам может понадобиться сохранять и обрабатывать строки, которые шире, чем любые из входных строк.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. Строки могут быть настолько широки, что некоторые операторы не смогут их обработать.The rows may be so wide that, sometimes, the particular operator can't process the row. Для таких широких строк компонент Компонент Database EngineDatabase Engine возвращает ошибку при выполнении запроса.If rows are that wide, the Компонент Database EngineDatabase Engine produces an error during query execution. ROBUST PLAN сообщает оптимизатору запросов, что следует игнорировать все планы запросов, в которых может возникнуть эта проблема.By using ROBUST PLAN, you instruct the query optimizer not to consider any query plans that may run into this problem.

Если такой план невозможен, оптимизатор запросов возвращает ошибку сразу, не откладывая обнаружение ошибок на момент выполнения запроса.If such a plan isn't possible, the query optimizer returns an error instead of deferring error detection to query execution. Строки могут содержать столбцы переменной длины; компонент Компонент Database EngineDatabase Engine позволяет указать для строк максимальный потенциальный размер, при превышении которого компонент Компонент Database EngineDatabase Engine может не суметь обработать их.Rows may contain variable-length columns; the Компонент Database EngineDatabase Engine allows for rows to be defined that have a maximum potential size beyond the ability of the Компонент Database EngineDatabase Engine to process them. В основном, несмотря на максимальный потенциальный размер, приложение сохраняет строки, имеющие актуальные размеры с ограничениями, которые компонент Компонент Database EngineDatabase Engine может обработать.Generally, despite the maximum potential size, an application stores rows that have actual sizes within the limits that the Компонент Database EngineDatabase Engine can process. Если компонент Компонент Database EngineDatabase Engine встречает слишком длинную строку, возвращается ошибка выполнения.If the Компонент Database EngineDatabase Engine comes across a row that is too long, an execution error is returned.

USE HINT ( ' hint_name ' )USE HINT ( 'hint_name' )
Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 1 (SP1)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) and База данных SQL AzureAzure SQL Database.

Предоставляет обработчику запросов одно или несколько дополнительных указаний.Provides one or more additional hints to the query processor. Дополнительные указания определяются именем указания в одинарных кавычках.The additional hints are specified by a hint name inside single quotation marks.

Поддерживаются следующие имена подсказок:The following hint names are supported:

  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
    Побуждает SQL ServerSQL Server создать план запроса с допущением простого вложения вместо допущения базового вложения по умолчанию для соединений в модели оценки кратности оптимизатора запросов версии SQL Server 2014 (12.x)SQL Server 2014 (12.x) или более поздних.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. Это указание эквивалентно флагу трассировки 9476.This hint name is equivalent to trace flag 9476.

  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    Заставляет SQL ServerSQL Server создавать план с минимальной избирательностью при оценке предикатов AND для фильтров в случае корреляции.Causes SQL ServerSQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation. Это указание эквивалентно флагу трассировки 4137 при использовании модели оценки кратности в SQL Server 2012 (11.x)SQL Server 2012 (11.x) и более ранних версиях и имеет тот же эффект, что и при использовании флага трассировки 9471 с моделью оценки кратности в SQL Server 2014 (12.x)SQL Server 2014 (12.x) или более поздних версиях.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'
    Отключает адаптивные соединения в пакетном режиме.Disables batch mode adaptive joins. Дополнительные сведения: Адаптивные соединения в пакетном режиме.For more information, see Batch mode Adaptive Joins. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database.

  • "DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK"'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
    Отключает обратную связь по временно предоставляемому буферу памяти в пакетном режиме.Disables batch mode memory grant feedback. Дополнительные сведения см. в разделе Обратная связь по временно предоставляемому буферу памяти в пакетном режиме.For more information, see Batch mode memory grant feedback. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database.

  • "DISABLE_DEFERRED_COMPILATION_TV"'DISABLE_DEFERRED_COMPILATION_TV'
    Отключает отложенную компиляцию табличных переменных.Disables table variable deferred compilation. См. дополнительные сведения об отложенной компиляции табличных переменных.For more information, see Table variable deferred compilation. Применимо к: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database.

  • "DISABLE_INTERLEAVED_EXECUTION_TVF"'DISABLE_INTERLEAVED_EXECUTION_TVF'
    Отключает выполнение с чередованием для функций с табличным значением с несколькими инструкциями.Disables interleaved execution for multi-statement table-valued functions. Дополнительные сведения см. в разделе о выполнении с чередованием для функций с табличным значением с несколькими инструкциями.For more information, see Interleaved execution for multi-statement table-valued functions. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database.

  • 'DISABLE_OPTIMIZED_NESTED_LOOP''DISABLE_OPTIMIZED_NESTED_LOOP'
    Заставляет обработчик запросов не использовать операцию сортировки (сортировки пакетов) для оптимизации соединений вложенного цикла при формировании плана запроса.Instructs the query processor not to use a sort operation (batch sort) for optimized nested loop joins when generating a query plan. Это указание эквивалентно флагу трассировки 2340.This hint name is equivalent to trace flag 2340.

  • 'DISABLE_OPTIMIZER_ROWGOAL' 'DISABLE_OPTIMIZER_ROWGOAL'
    Указывает, что SQL Server должен создать план без использования изменений целей строк с запросами, содержащими следующие ключевые слова:Causes SQL Server to generate a plan that doesn't use row goal modifications with queries that contain these keywords:

    • В началоTOP
    • OPTION (FAST N);OPTION (FAST N)
    • ININ
    • EXISTSEXISTS

    Это указание эквивалентно флагу трассировки 4138.This hint name is equivalent to trace flag 4138.

  • 'DISABLE_PARAMETER_SNIFFING''DISABLE_PARAMETER_SNIFFING'
    Указывает, что оптимизатор запросов должен использовать среднее распределение данных при компиляции запроса с одним или несколькими параметрами.Instructs query optimizer to use average data distribution while compiling a query with one or more parameters. Эта инструкция делает план запроса независимым от значения параметра, которое было использовано при первой компиляции запроса.This instruction makes the query plan independent on the parameter value that was first used when the query was compiled. Это указание эквивалентно флагу трассировки 4136 или параметру конфигурации области баз данных PARAMETER_SNIFFING = OFF.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'
    Отключает обратную связь по временно предоставляемому буферу памяти в строковом режиме.Disables row mode memory grant feedback. Дополнительные сведения см. в разделе Обратная связь по временно предоставляемому буферу памяти в строковом режиме.For more information, see Row mode memory grant feedback. Применимо к: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database.

  • "DISABLE_TSQL_SCALAR_UDF_INLINING"'DISABLE_TSQL_SCALAR_UDF_INLINING'
    Отключает встраивание скалярных пользовательских функций.Disables scalar UDF inlining. Дополнительные сведения: Встраивание скалярной функции, определяемой пользователем.For more information, see Scalar UDF Inlining. Применимо к: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview).Applies to: SQL ServerSQL Server (starting with Предварительная версия SQL Server 2019SQL Server 2019 preview).

  • "DISALLOW_BATCH_MODE"'DISALLOW_BATCH_MODE'
    Отключает выполнение в пакетном режиме.Disables batch mode execution. Дополнительные сведения см. в разделе Режимы выполнения.For more information, see Execution modes. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database.

  • 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS''ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
    Позволяет использовать автоматически созданную быструю статистику (поправку к гистограмме) для любого начального столбца индекса, для которого требуется оценить кратность.Enables automatically generated quick statistics (histogram amendment) for any leading index column for which cardinality estimation is needed. Гистограмма, используемая для оценки кратности, будет так откорректирована во время компиляции запроса, чтобы учитывать фактическое максимальное или минимальное значение этого столбца.The histogram used to estimate cardinality will be adjusted at query compile time to account for actual maximum or minimum value of this column. Это указание эквивалентно флагу трассировки 4139.This hint name is equivalent to trace flag 4139.

  • 'ENABLE_QUERY_OPTIMIZER_HOTFIXES''ENABLE_QUERY_OPTIMIZER_HOTFIXES'
    Включает исправления в оптимизаторе запросов, выпущенные в накопительных пакетах обновления и пакетах обновления SQL Server.Enables query optimizer hotfixes (changes released in SQL Server Cumulative Updates and Service Packs). Это указание эквивалентно флагу трассировки 4199 или параметру конфигурации области баз данных QUERY_OPTIMIZER_HOTFIXES = ON.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'
    Заставляет оптимизатор запросов использовать модель оценки кратности, которая соответствует текущему уровню совместимости базы данных.Forces the Query Optimizer to use Cardinality Estimation model that corresponds to the current database compatibility level. Используйте это указание для переопределения параметра конфигурации области баз данных LEGACY_CARDINALITY_ESTIMATION = ON или флага трассировки 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'
    Заставляет оптимизатор запросов использовать модель оценки кратности для SQL Server 2012 (11.x)SQL Server 2012 (11.x) и более ранних версий.Forces the query optimizer to use Cardinality Estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions. Это указание эквивалентно флагу трассировки 9481 или параметру конфигурации области баз данных LEGACY_CARDINALITY_ESTIMATION = ON.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'
    Принудительно изменяет поведение оптимизатора запросов на уровне запроса.Forces the query optimizer behavior at a query level. Оптимизация выполняется так, как если бы запрос компилировался с уровнем совместимости базы данных n, где n— максимальный поддерживаемый уровень совместимости базы данных.This behavior happens as if the query was compiled with database compatibility level n, where n is a supported database compatibility level. Список значений, поддерживаемых сейчас для n, см. здесь: sys.dm_exec_valid_use_hints.Refer to sys.dm_exec_valid_use_hints for a list of currently supported values for n. Применимо к : SQL ServerSQL Server (начиная с 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).

    Примечание

    Указание QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n не переопределяет значение по умолчанию или унаследованное значение параметра оценки кратности, если оно указано в конфигурации области базы данных, с помощью флага трассировки или другого указания запроса, например 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.
    Это указание влияет только на поведение оптимизатора запросов.This hint only affects the behavior of the query optimizer. Оно не влияет на другие функции SQL ServerSQL Server, которые могут зависеть от уровня совместимости базы данных, в том числе на доступность определенных функций базы данных.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.
    Дополнительные сведения об этом указании см. в разделе Developer’s Choice: Hinting Query Execution model (Выбор разработчика: модель выполнения запроса указания).To learn more about this hint, see Developer's Choice: Hinting Query Execution model.

  • 'QUERY_PLAN_PROFILE''QUERY_PLAN_PROFILE'
    Включает упрощенное профилирование для запроса.Enables lightweight profiling for the query. Когда завершается запрос, содержащий это новое указание, вызывается новое расширенное событие query_plan_profile.When a query that contains this new hint finishes, a new Extended Event, query_plan_profile, is fired. Это расширенное событие предоставляет статистику выполнения и фактический план выполнения XML (подобно расширенному событию query_post_execution_showplan, но только для запросов, содержащих новое указание).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. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и накопительным пакетом обновления 3 (CU3) и SQL Server 2017 (14.x)SQL Server 2017 (14.x) с накопительным пакетом обновления 11 (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).

    Примечание

    Если включен сбор расширенных событий query_post_execution_showplan, в каждый запрос, который выполняется на сервере, будет добавлена стандартная инфраструктура профилирования. Это может повлиять на общую производительность сервера.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.
    Если вместо этого вы включите сбор расширенных событий query_thread_profile для использования упрощенной инфраструктуры профилирования, издержки производительности будут гораздо ниже, но по-прежнему могут влиять на производительность сервера.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.
    Если вы включите расширенное событие query_plan_profile, упрощенная инфраструктура профилирования будет применяться только к запросам, которые выполняются с указанием QUERY_PLAN_PROFILE, и не повлияет на другие рабочие нагрузки на сервере.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 this hint to profile a specific query without affecting other parts of the server workload. Дополнительные сведения об облегченном профилировании см. в разделе Инфраструктура профилирования запросов.To learn more about lightweight profiling, see Query Profiling Infrastructure.

Список всех поддерживаемых имен USE HINT можно запросить с помощью динамического административного представления 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.

Совет

В именах указаний учитывается регистр.Hint names are case-insensitive.

Важно!

Некоторые указания USE HINT могут конфликтовать с флагами трассировки, включенными на глобальном уровне или уровне сеанса, или параметрами конфигурации области баз данных.Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings. В этом случае приоритет всегда имеет указание уровня запроса (USE HINT).In this case, the query level hint (USE HINT) always takes precedence. Если USE HINT конфликтует с другим указанием запроса или флагом трассировки, включенным на уровне запроса (например, с помощью QUERYTRACEON), при попытке выполнить запрос SQL ServerSQL Server выведет ошибку.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'
Указывает оптимизатору запросов использовать существующий план запроса для запроса, определенного параметром ' xml_plan ' .Forces the query optimizer to use an existing query plan for a query that is specified by 'xml_plan'. Указание USE PLAN нельзя использовать в инструкциях INSERT, UPDATE, MERGE и DELETE.USE PLAN can't be specified with INSERT, UPDATE, MERGE, or DELETE statements.

TABLE HINT ( exposed_object_name [ , <table_hint> [ [ , ]...n ] ] ) Применяет заданное табличное указание к таблице или представлению, которые соответствуют имени 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. Табличные указания рекомендуется использовать в качестве подсказок в запросах только в контексте структуры плана.We recommend using a table hint as a query hint only in the context of a plan guide.

Аргумент exposed_object_name может представлять одну из следующих ссылок:exposed_object_name can be one of the following references:

  • Если в предложении FROM используется псевдоним таблицы или представления, exposed_objeсt_name совпадает с этим псевдонимом.When an alias is used for the table or view in the FROM clause of the query, exposed_object_name is the alias.

  • Если псевдоним не используется, exposed_object_name будет точным соответствием таблицы или представления, на которые ссылается предложение FROM.When an alias isn't used, exposed_object_name is the exact match of the table or view referenced in the FROM clause. Например, если ссылка на таблицу или представление является двухкомпонентным именем, аргумент exposed_object_name будет тем же двухкомпонентным именем.For example, if the table or view is referenced using a two-part name, exposed_object_name is the same two-part name.

Если вы укажете exposed_object_name без табличного указания, любые индексы, которые указаны в составе табличного указания для этого объекта в запросе, будут игнорироваться.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. Затем оптимизатор запросов определяет использование индексов.The query optimizer then determines index usage. Эта методика позволяет устранить влияние табличного указания INDEX, если нет возможности изменить первоначальный запрос.You can use this technique to eliminate the effect of an INDEX table hint when you can't modify the original query. См. пример К.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 } Это табличное указание применяется в качестве указания запроса к таблице или представлению, которые соответствуют значению exposed_object_name.<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. Описание этих указаний см. в разделе Табличные указания (Transact-SQL).For a description of these hints, see Table Hints (Transact-SQL).

Табличные указания, за исключением INDEX, FORCESCAN и FORCESEEK, не могут использоваться как указания запроса, кроме тех случаев, когда в запросе уже содержится предложение WITH, задающее табличное указание.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. Дополнительные сведения см. в подразделе "Примечания".For more information, see Remarks.

Внимание!

Указание FORCESEEK с параметрами ограничивает число планов, которые могут быть использованы оптимизатором, в отличие от указания FORCESEEK без параметров.Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. Из-за этого может чаще возникать ошибка "Невозможно сформировать план".This may cause a "Plan cannot be generated" error to occur in more cases. В будущих выпусках внутренние изменения оптимизатора могут привести к увеличению числа этих планов.In a future release, internal modifications to the optimizer may allow more plans to be considered.

RemarksRemarks

Указания запросов нельзя задавать в инструкции INSERT, кроме случая, когда внутри этой инструкции используется предложение SELECT.Query hints can't be specified in an INSERT statement, except when a SELECT clause is used inside the statement.

Указания запросов можно задавать только в запросах верхнего уровня, но не во вложенных запросах.Query hints can be specified only in the top-level query, not in subqueries. Если табличное указание задается в качестве указания запроса, его можно определить в запросе верхнего уровня или во вложенном запросе.When a table hint is specified as a query hint, the hint can be specified in the top-level query or in a subquery. Но при этом значение exposed_object_name в предложении TABLE HINT должно точно соответствовать имени, предоставленному в запросе или вложенном запросе.However, the value specified for exposed_object_name in the TABLE HINT clause must match exactly the exposed name in the query or subquery.

Определение табличных указаний как указаний запросаSpecifying Table Hints as Query Hints

Табличные указания INDEX, FORCESCAN или FORCESEEK рекомендуется использовать в качестве указаний запроса только в контексте структуры плана.We recommend using the INDEX, FORCESCAN, or FORCESEEK table hint as a query hint only in the context of a plan guide. Структуры планов полезны, когда нет возможности изменить первоначальный запрос, например, если он является приложением стороннего разработчика.Plan guides are useful when you can't modify the original query, for example, because it's a third-party application. Указание запроса, заданное в структуре плана, добавляется к запросу перед его компиляцией и оптимизацией.The query hint specified in the plan guide is added to the query before it's compiled and optimized. В автоматизированных запросах предложение TABLE HINT используется только при тестировании инструкций структуры планов.For ad-hoc queries, use the TABLE HINT clause only when testing plan guide statements. Для всех других нерегламентированных запросов рекомендуется задавать эти указания только как табличные.For all other ad-hoc queries, we recommend specifying these hints only as table hints.

Табличные указания INDEX, FORCESCAN и FORCESEEK, определенные в качестве указаний запроса, допустимы для следующих объектов:When specified as a query hint, the INDEX, FORCESCAN, and FORCESEEK table hints are valid for the following objects:

  • ТаблицыTables
  • ПредставленияViews
  • Индексированные представленияIndexed views
  • Обобщенные табличные выражения (подсказку необходимо указывать в инструкции SELECT, результирующий набор которой заполняет обобщенное табличное выражение)Common table expressions (the hint must be specified in the SELECT statement whose result set populates the common table expression)
  • Динамические административные представленияDynamic management views
  • Именованные вложенные запросыNamed subqueries

Вы можете указать табличные указания INDEX, FORCESCAN и FORCESEEK как указания запроса, если в этом запросе не существует табличных указаний.You can specify INDEX, FORCESCAN, and FORCESEEK table hints as query hints for a query that doesn't have any existing table hints. Кроме того, их можно использовать для замены в запросе существующих указаний INDEX, FORCESCAN или FORCESEEK соответственно.You can also use them to replace existing INDEX, FORCESCAN, or FORCESEEK hints in the query, respectively.

Табличные указания, за исключением INDEX, FORCESCAN и FORCESEEK, не могут использоваться как указания запроса, кроме тех случаев, когда в запросе уже содержится предложение WITH, задающее табличное указание.Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. В этом случае следует создать аналогичное указание в качестве указания запроса.In this case, a matching hint must also be specified as a query hint. Чтобы задать аналогичное указание в качестве указания запроса, включите TABLE HINT в предложение OPTION.Specify the matching hint as a query hint by using TABLE HINT in the OPTION clause. Эта спецификация сохраняет семантику запроса.This specification preserves the query's semantics. Например, если запрос содержит табличное указание NOLOCK, то предложение OPTION в параметре **@hints** руководства плана также должно содержать указание 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. См. пример Л.See Example K.

В ряде случаев возникает ошибка 8072.Error 8072 occurs in a couple of scenarios. Во-первых, если табличное указание, отличное от INDEX, FORCESCAN и FORCESEEK, включено в TABLE HINT в предложении OPTION, но не существует аналогичного указания запроса.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. Во-вторых — в обратной ситуации.The second scenario is the other way around. Эта ошибка означает, что предложение OPTION может изменить семантику запроса и запрос завершится с ошибкой.This error indicates the OPTION clause can cause the semantics of the query to change, and the query fails.

ПримерыExamples

A.A. Использование MERGE JOINUsing MERGE JOIN

Следующий пример указывает, что операция JOIN в запросе выполняется с помощью MERGE JOIN.The following example specifies that MERGE JOIN runs the JOIN operation in the query. В этом примере используется база данных 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. Использование OPTIMIZE FORUsing OPTIMIZE FOR

В следующем примере оптимизатору запросов предписывается использовать значение 'Seattle' для локальной переменной @city_name и использовать статистические данные для определения локальной переменной @postal_code при оптимизации запроса.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. В этом примере используется база данных 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. Использование MAXRECURSIONUsing MAXRECURSION

Подсказка MAXRECURSION может использоваться для предотвращения входа в бесконечный цикл из-за неверно сформированного рекурсивного обобщенного табличного выражения.MAXRECURSION can be used to prevent a poorly formed recursive common table expression from entering into an infinite loop. В следующем примере преднамеренно формируется бесконечный цикл и используется указание MAXRECURSION для ограничения числа уровней рекурсии двумя.The following example intentionally creates an infinite loop and uses the MAXRECURSION hint to limit the number of recursion levels to two. В этом примере используется база данных 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  

После исправления ошибки в коде подсказка MAXRECURSION больше не нужна.After the coding error is corrected, MAXRECURSION is no longer required.

Г.D. Использование MERGE UNIONUsing MERGE UNION

В следующем примере используется указание запроса MERGE UNION.The following example uses the MERGE UNION query hint. В этом примере используется база данных 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. Использование HASH GROUP и FASTUsing HASH GROUP and FAST

В следующем примере используется указания запросов HASH GROUP и FAST.The following example uses the HASH GROUP and FAST query hints. В этом примере используется база данных 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. Использование MAXDOPUsing MAXDOP

В следующем примере используется указание запроса MAXDOP.The following example uses the MAXDOP query hint. В этом примере используется база данных AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

Применимо к: с SQL Server 2008SQL Server 2008 до 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. Использование INDEXUsing INDEX

В следующем примере используется указание в запросе INDEX.The following examples use the INDEX hint. В первом примере задан один индекс.The first example specifies a single index. Во втором примере указывается несколько индексов для одной табличной ссылки.The second example specifies multiple indexes for a single table reference. К таблице с псевдонимом применено указание INDEX, поэтому в обоих примерах необходимо указать тот же псевдоним в предложении TABLE HINT в качестве имени видимого объекта.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. В этом примере используется база данных 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. Использование FORCESEEKUsing FORCESEEK

В следующем примере используется табличное указание FORCESEEK.The following example uses the FORCESEEK table hint. В предложении TABLE HINT также необходимо указать двухкомпонентное имя, которое совпадает с именем видимого объекта.The TABLE HINT clause must also specify the same two-part name as the exposed object name. Укажите имя при применении указания INDEX к таблице, которая использует двухкомпонентное имя.Specify the name when you apply the INDEX hint on a table that uses a two-part name. В этом примере используется база данных 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. Использование нескольких табличных указанийUsing multiple table hints

В следующем примере к одной таблице применяется указание INDEX, а к другой — указание FORCESEEK.The following example applies the INDEX hint to one table and the FORCESEEK hint to another. В этом примере используется база данных 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. Использование TABLE HINT для замещения существующего табличного указанияUsing TABLE HINT to override an existing table hint

В следующем примере показано, как использовать указание TABLE HINT.The following example shows how to use the TABLE HINT hint. Это указание можно использовать без дополнительного указания, переопределяющего поведение табличного указания INDEX, которое указано в предложении FROM в запросе.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. В этом примере используется база данных 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. Определение табличных указаний, влияющих на семантикуSpecifying semantics-affecting table hints

В следующем примере в запросе содержатся два указания таблицы: NOLOCK, которое изменяет семантику, и INDEX, которое не изменяет семантику.The following example contains two table hints in the query: NOLOCK, which is semantic-affecting, and INDEX, which is non-semantic-affecting. Чтобы сохранить семантику запроса, указание NOLOCK задается в предложении OPTIONS структуры плана.To preserve the semantics of the query, the NOLOCK hint is specified in the OPTIONS clause of the plan guide. Наряду с указанием NOLOCK задайте указания INDEX и FORCESEEK, а также замените не влияющее на семантику указание INDEX в запросе при компиляции и оптимизации инструкции.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. В этом примере используется база данных 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    

В следующем примере показан альтернативный метод сохранения семантики запроса, позволяющий оптимизатору выбрать другой индекс, в отличие от заданного в табличном указании.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. Предоставьте этот выбор оптимизатору, задав указание NOLOCK в предложении OPTIONS.Allow the optimizer to choose by specifying the NOLOCK hint in the OPTIONS clause. Указание нужно для того, чтобы изменить семантику.You specify the hint because it's semantic-affecting. Также укажите ключевое слово TABLE HINT со ссылкой на таблицу, но без указания INDEX.Then, specify the TABLE HINT keyword with only a table reference and no INDEX hint. В этом примере используется база данных 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. Указание USE HINTUsing USE HINT

В следующем примере используются указания запросов RECOMPILE и USE HINT.The following example uses the RECOMPILE and USE HINT query hints. В этом примере используется база данных AdventureWorks2012AdventureWorks2012.The example uses the AdventureWorks2012AdventureWorks2012 database.

Применимо к: База данных SQL AzureAzure SQL Database, SQL Server 2016 (13.x)SQL Server 2016 (13.x).Applies to: База данных SQL 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  

См. такжеSee Also

Указания (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)
Флаги трассировки Trace Flags
Синтаксические обозначения в Transact-SQLTransact-SQL Syntax Conventions