Табличные указания (Transact-SQL)Hints (Transact-SQL) - Table

ОБЛАСТЬ ПРИМЕНЕНИЯ ЭТОЙ СТАТЬИ:даSQL Server (начиная с 2008)даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseTHIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Табличные подсказки переопределяют поведение оптимизатора запросов по умолчанию на время выполнения инструкции языка обработки данных (DML) указанием способа блокировки, одного или более индексов, операции обработки запроса, например просмотра таблицы или поиска в индексе, или других параметров.Table hints override the default behavior of the query optimizer for the duration of the data manipulation language (DML) statement by specifying a locking method, one or more indexes, a query-processing operation such as a table scan or index seek, or other options. Табличные указания задаются в предложении FROM инструкции DML и относятся только к таблицам и представлениям, на которые ссылается это предложение.Table hints are specified in the FROM clause of the DML statement and affect only the table or view referenced in that clause.

Внимание!

Поскольку оптимизатор запросов SQL ServerSQL Server обычно выбирает наилучший план выполнения запроса, подсказки рекомендуется использовать только опытным разработчикам и администраторам баз данных в качестве последнего средства.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

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

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax


WITH  ( <table_hint> [ [, ]...n ] )  

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

<table_hint_limited> ::=  
{  
    KEEPIDENTITY   
  | KEEPDEFAULTS   
  | HOLDLOCK   
  | IGNORE_CONSTRAINTS   
  | IGNORE_TRIGGERS   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT   
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK   
}   

АргументыArguments

WITH ( <table_hint> ) [ [, ]...n ]WITH ( <table_hint> ) [ [, ]...n ]
Табличные указания, за некоторыми исключениями, поддерживаются в предложении FROM только в случае, если они задаются с ключевым словом WITH.With some exceptions, table hints are supported in the FROM clause only when the hints are specified with the WITH keyword. Табличные указания также необходимо заключать в скобки.Table hints also must be specified with parentheses.

Важно!

Пропуск ключевого слова WITH является устаревшей возможностью: Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.Omitting the WITH keyword is a deprecated feature: Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Следующие табличные указания допускаются как с ключевым словом WITH, так и без него: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT и NOEXPAND.The following table hints are allowed with and without the WITH keyword: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT, and NOEXPAND. Если такие табличные указания указываются без ключевого слова WITH, подсказки следует задавать отдельно.When these table hints are specified without the WITH keyword, the hints should be specified alone. Пример:For example:

FROM t (TABLOCK)  

Если подсказка указана с другим параметром, ее необходимо указывать с ключевым словом WITH:When the hint is specified with another option, the hint must be specified with the WITH keyword:

FROM t WITH (TABLOCK, INDEX(myindex))  

Между табличными подсказками рекомендуется ставить запятые.We recommend using commas between table hints.

Важно!

Разделение подсказок пробелами, а не с помощью запятых, является устаревшей возможностью. В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Не используйте его при работе над новыми приложениями и как можно быстрее измените приложения, в которых он в настоящее время используется.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.Separating hints by spaces rather than commas is a deprecated feature: В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Не используйте его при работе над новыми приложениями и как можно быстрее измените приложения, в которых он в настоящее время используется.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

NOEXPANDNOEXPAND
Указывает, что при обработке запроса оптимизатором запросов никакие индексированные представления не расширяются для доступа к базовым таблицам.Specifies that any indexed views are not expanded to access underlying tables when the query optimizer processes the query. Оптимизатор запросов обрабатывает представление так же, как и таблицу с кластеризованным индексом.The query optimizer treats the view like a table with clustered index. Аргумент NOEXPAND применяется только для индексированных представлений.NOEXPAND applies only to indexed views. Дополнительные сведения см. в подразделе "Примечания".For more information, see Remarks.

INDEX (index_value [,... n ] ) | INDEX = ( index_value)INDEX (index_value [,... n ] ) | INDEX = ( index_value)
Синтаксис INDEX() указывает имя или идентификатор одного или более индексов, используемых при обработке инструкции оптимизатором запросов.The INDEX() syntax specifies the names or IDs of one or more indexes to be used by the query optimizer when it processes the statement. Альтернативный синтаксис «INDEX =» позволяет задать отдельное значение индекса.The alternative INDEX = syntax specifies a single index value. Для каждой таблицы можно задать только одно указание индекса.Only one index hint per table can be specified.

Если имеется кластеризованный индекс, аргумент INDEX(0) приводит к просмотру кластеризованного индекса, а INDEX(1) — к просмотру или поиску по кластеризованному индексу.If a clustered index exists, INDEX(0) forces a clustered index scan and INDEX(1) forces a clustered index scan or seek. Если кластеризованного индекса нет, аргумент INDEX(0) приводит к просмотру таблицы, а INDEX(1) интерпретируется как ошибка.If no clustered index exists, INDEX(0) forces a table scan and INDEX(1) is interpreted as an error.

Если в отдельном списке указаний используются несколько индексов, повторяющиеся индексы пропускаются, а остальные используются для получения строк из таблицы.If multiple indexes are used in a single hint list, the duplicates are ignored and the rest of the listed indexes are used to retrieve the rows of the table. Порядок индексов в указании индекса имеет значение.The order of the indexes in the index hint is significant. Несколько указаний индекса также принудительно выполняют операции И с индексами, и оптимизатор запросов применяет столько условий, сколько возможно для каждого из индексов, к которым он получает доступ.A multiple index hint also enforces index ANDing, and the query optimizer applies as many conditions as possible on each index accessed. Если коллекция индексов с подсказками не включает все указанные в запросе столбцы, то выборка для получения остальных столбцов выполняется после того, как компонентом Компонент SQL Server Database EngineSQL Server Database Engine будут получены все индексированные столбцы.If the collection of hinted indexes do not include all columns referenced by the query, a fetch is performed to retrieve the remaining columns after the Компонент SQL Server Database EngineSQL Server Database Engine retrieves all the indexed columns.

Примечание

Если указание индекса, ссылающееся на несколько индексов, используется в таблице фактов в соединении типа «звезда», оптимизатор не учитывает индекс и возвращает предупреждение.When an index hint referring to multiple indexes is used on the fact table in a star join, the optimizer ignores the index hint and returns a warning message. Кроме того, выполнение операции ИЛИ с индексами также не разрешено для таблицы с заданным указанием индекса.Also, index ORing is not allowed for a table with an index hint specified.

Максимальное число индексов в табличном указании равно 250 некластеризованным индексам.The maximum number of indexes in the table hint is 250 nonclustered indexes.

KEEPIDENTITYKEEPIDENTITY
Применяется только в инструкции INSERT, когда параметр BULK используется с OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Указывает, что значение или значения идентификаторов в файле импортированных данных будут использоваться для столбца идентификаторов.Specifies that identity value or values in the imported data file are to be used for the identity column. Если аргумент KEEPIDENTITY не указан, значения идентификаторов для данного столбца проверяются, но не импортируются, а оптимизатор запросов автоматически назначает уникальные значения на основе начального значения и приращения, заданных при создании таблицы.If KEEPIDENTITY is not specified, the identity values for this column are verified but not imported and the query optimizer automatically assigns unique values based on the seed and increment values specified during table creation.

Важно!

Если файл данных не содержит значений столбца идентификаторов таблицы или представления, а столбец идентификаторов не является последним в таблице, этот столбец необходимо пропустить.If the data file does not contain values for the identity column in the table or view, and the identity column is not the last column in the table, you must skip the identity column. Дополнительные сведения см. в разделе Использование файла форматирования для пропуска поля данных (SQL Server).For more information, see Use a Format File to Skip a Data Field (SQL Server). Если столбец идентификаторов успешно пропущен, то оптимизатор запросов автоматически назначает уникальные значения для столбца идентификаторов в импортируемые строки таблицы.If an identity column is skipped successfully, the query optimizer automatically assigns unique values for the identity column into the imported table rows.

Пример использования данного указания в инструкции INSERT… Дополнительные сведения об инструкции SELECT * FROM OPENROWSET(BULK...) см. в разделе Сохранение значений идентификаторов при массовом импорте данных (SQL Server).For an example that uses this hint in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement, see Keep Identity Values When Bulk Importing Data (SQL Server).

Дополнительные сведения о проверке идентифицирующего значения для таблицы см. в разделе DBCC CHECKIDENT (Transact-SQL).For information about checking the identity value for a table, see DBCC CHECKIDENT (Transact-SQL).

KEEPDEFAULTSKEEPDEFAULTS
Применяется только в инструкции INSERT, когда параметр BULK используется с OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Указывает на вставку установленного по умолчанию значения столбца таблицы, если таковое имеется, вместо значения NULL, применяемого в случае, когда запись данных не содержит значения для этого столбца.Specifies insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

Пример использования данного указания в инструкции INSERT… Дополнительные сведения об инструкции SELECT * FROM OPENROWSET(BULK...) см. в разделе Сохранение значений NULL или использование значений по умолчанию при массовом импорте данных (SQL Server).For an example that uses this hint in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

FORCESEEK [ (index_value(index_column_name [ ,... n ] )) ]FORCESEEK [ (index_value(index_column_name [ ,... n ] )) ]
Указывает, что в качестве пути доступа к данным таблиц или представлений оптимизатор запросов использует только операцию поиска в индексе.Specifies that the query optimizer use only an index seek operation as the access path to the data in the table or view.

Примечание

Начиная с SQL Server 2008 R2SQL Server 2008 R2 с пакетом обновления 1 (SP1), также могут указываться параметры индекса.Starting with SQL Server 2008 R2SQL Server 2008 R2 SP1, index parameters can also be specified. В таком случае оптимизатор запросов будет использовать при выполнении операций поиска в индексе по указанному индексу как минимум все указанные столбцы индекса.In that case, the query optimizer considers only index seek operations through the specified index using at least the specified index columns.

index_valueindex_value
Имя или значение идентификатора индекса.Is the index name or index ID value. Указывать идентификатор индекса 0 (куча) нельзя.The index ID 0 (heap) cannot be specified. Чтобы получить имя или идентификатор индекса, запросите представление каталога sys.indexes.To return the index name or ID, query the sys.indexes catalog view.

index_column_nameindex_column_name
Это имя столбца индекса, включаемого в операцию поиска.Is the name of the index column to include in the seek operation. Указание FORCESEEK с параметрами индекса аналогично использованию FORCESEEK с указанием INDEX.Specifying FORCESEEK with index parameters is similar to using FORCESEEK with an INDEX hint. Но более эффективного контроля над путем доступа, который использует оптимизатор запросов, можно добиться указанием и индекса, в котором следует провести поиск, и столбцов индекса, которые предполагается использовать в операции поиска.However, you can achieve greater control over the access path used by the query optimizer by specifying both the index to seek on and the index columns to consider in the seek operation. При необходимости оптимизатор может задействовать дополнительные столбцы.The optimizer may consider additional columns if needed. Например, если указан некластеризованный индекс, то оптимизатор может в дополнение к указанным столбцам выбрать использование ключевых столбцов кластеризованного индекса.For example, if a nonclustered index is specified, the optimizer may choose to use clustered index key columns in addition to the specified columns.

Подсказка FORCESEEK может быть указана следующим образом.The FORCESEEK hint can be specified in the following ways.

СинтаксисSyntax ПримерExample ОписаниеDescription
Без указания INDEX или индексаWithout an index or INDEX hint FROM dbo.MyTable WITH (FORCESEEK) Оптимизатор запросов использует только операции поиска в индексе для доступа к таблицам или представлениям через любой подходящий индекс.The query optimizer considers only index seek operations to access the table or view through any relevant index.
В сочетании с подсказкой INDEXCombined with an INDEX hint FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) Оптимизатор запросов будет использовать при доступе к таблице или представлению через указанный индекс только операции поиска по индексу.The query optimizer considers only index seek operations to access the table or view through the specified index.
Параметризация посредством указания индекса и столбцов индексаParameterized by specifying an index and index columns FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) Оптимизатор запросов будет использовать при выполнении поиска по указанной таблице или представлению индексу как минимум указанные столбцы индекса.The query optimizer considers only index seek operations to access the table or view through the specified index using at least the specified index columns.

При использовании указания FORCESEEK (с указанием параметров индексов или без них) руководствуйтесь следующими рекомендациями:When using the FORCESEEK hint (with or without index parameters), consider the following guidelines:

  • Указание может задаваться как табличное указание или как указание запроса.The hint can be specified as a table hint or as a query hint. Дополнительные сведения об указаниях запроса см. в разделе Указания запроса (Transact-SQL).For more information about query hints, see Query Hints (Transact-SQL).
  • Чтобы применить FORCESEEK к индексированному представлению, должно быть также задано указание NOEXPAND.To apply FORCESEEK to an indexed view, the NOEXPAND hint must also be specified.
  • Указание может применяться не более одного раза для каждой таблицы или представления.The hint can be applied at most once per table or view.
  • Указание не может задаваться для удаленного источника данных.The hint cannot be specified for a remote data source. Если FORCESEEK задается вместе с указанием индекса, то возвращается ошибка 7377, а если FORCESEEK используется без указания индекса, то возвращается ошибка 8180.Error 7377 is returned when FORCESEEK is specified with an index hint and error 8180 is returned when FORCESEEK is used without an index hint.
  • Если из-за подсказки FORCESEEK план не был найден, возвращается ошибка 8622.If FORCESEEK causes no plan to be found, error 8622 is returned.

Если FORCESEEK указывается с параметрами индекса, применяются следующие ограничения и рекомендации:When FORCESEEK is specified with index parameters, the following guidelines and restrictions apply:

  • Указание нельзя задать для таблицы, которая является целевой для инструкции INSERT, UPDATE или DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.
  • Указание не может задаваться в сочетании с указанием INDEX или другим указанием FORCESEEK.The hint cannot be specified in combination with either an INDEX hint or another FORCESEEK hint.
  • Должен быть указан хотя бы один столбец, который должен быть ведущим ключевым столбцом.At least one column must be specified and it must be the leading key column.
  • Можно указывать дополнительные столбцы индекса, однако пропускать ключевые столбцы нельзя.Additional index columns can be specified, however, key columns cannot be skipped. Например, если указанный индекс содержит ключевые столбцы a, b и c, то правильный синтаксис должен содержать FORCESEEK (MyIndex (a)) и FORCESEEK (MyIndex (a, b).For example, if the specified index contains the key columns a, b, and c, valid syntax would include FORCESEEK (MyIndex (a)) and FORCESEEK (MyIndex (a, b). Неправильный синтаксис может содержать FORCESEEK (MyIndex (c)) и FORCESEEK (MyIndex (a, c).Invalid syntax would include FORCESEEK (MyIndex (c)) and FORCESEEK (MyIndex (a, c).
  • Порядок следования имен столбцов, заданный в указании, должен соответствовать порядку столбцов в упоминаемом индексе.The order of column names specified in the hint must match the order of the columns in the referenced index.
  • Столбцы, не входящие в определение ключа индекса, указывать нельзя.Columns that are not in the index key definition cannot be specified. Например, в некластеризованном индексе могут быть указаны только определенные в индексе ключевые столбцы.For example, in a nonclustered index, only the defined index key columns can be specified. Столбцы кластеризованного ключа, автоматически включаемые в индекс, указывать нельзя, однако они могут использоваться оптимизатором.Clustered key columns that are automatically included in the index cannot be specified, but may be used by the optimizer.
  • Оптимизированный для памяти xVelocity индекс columnstore не может указываться в качестве параметра индекса.An xVelocity memory optimized columnstore index cannot be specified as an index parameter. Возвращается ошибка 366.Error 366 is returned.
  • Изменение определения индекса (например, добавление или удаление столбцов) может потребовать внесения изменений в запросы, ссылающиеся на этот индекс.Modifying the index definition (for example, by adding or removing columns) may require modifications to the queries that reference that index.
  • Указание запрещает оптимизатору использовать пространственные индексы и XML-индексы таблицы.The hint prevents the optimizer from considering any spatial or XML indexes on the table.
  • Указание не может задаваться в сочетании с указанием FORCESCAN.The hint cannot be specified in combination with the FORCESCAN hint.
  • Для секционированных индексов столбец секционирования, неявно добавляемый SQL ServerSQL Server, не может быть задаваться в указании FORCESEEK.For partitioned indexes, the partitioning column implicitly added by SQL ServerSQL Server cannot be specified in the FORCESEEK hint.

Внимание!

Указание 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.

FORCESCAN Применимо к: SQL Server 2008 R2SQL Server 2008 R2 с пакетом обновления 1 (SP1) и до SQL Server 2017SQL Server 2017.FORCESCAN Applies to: SQL Server 2008 R2SQL Server 2008 R2 SP1 through SQL Server 2017SQL Server 2017. Указывает, что в качестве пути доступа к ссылочным таблицам или представлениям оптимизатор запросов использует только операцию поиска в индексе.Specifies that the query optimizer use only an index scan operation as the access path to the referenced table or view. Указание FORCESCAN может оказаться полезным в тех запросах, где оптимизатор недооценивает число затрагиваемых строк и выбирает операцию поиска, а не просмотра.The FORCESCAN hint can be useful for queries in which the optimizer underestimates the number of affected rows and chooses a seek operation rather than a scan operation. В этом случае объем памяти, выделенный для данной операции, будет недостаточным, что повлияет на производительность запроса.When this occurs, the amount of memory granted for the operation is too small and query performance is impacted.

Указание FORCESCAN может быть указано с указанием INDEX или без него.FORCESCAN can be specified with or without an INDEX hint. В сочетании с указанием индекса (INDEX = index_name, FORCESCAN) оптимизатор запросов рассматривает пути доступа просмотра через указанный индекс при доступе к упоминаемой таблице.When combined with an index hint, (INDEX = index_name, FORCESCAN), the query optimizer considers only scan access paths through the specified index when accessing the referenced table. Указание FORCESCAN может задаваться с указанием индекса INDEX(0) для принудительного просмотра базовой таблицы.FORCESCAN can be specified with the index hint INDEX(0) to force a table scan operation on the base table.

Для секционированных таблиц и индексов указание FORCESCAN применяется после устранения секционирования посредством вычисления предиката запроса.For partitioned tables and indexes, FORCESCAN is applied after partitions have been eliminated through query predicate evaluation. Это означает, что просмотр выполняется только по оставшимся секциям, а не по всей таблице.***This means that the scan is applied only to the remaining partitions and not to the entire table.

Указание FORCESCAN имеет следующие ограничения:The FORCESCAN hint has the following restrictions:

  • Указание нельзя задать для таблицы, которая является целевой для инструкции INSERT, UPDATE или DELETE.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.
  • Указание не может быть задаваться с более чем одним указанием индекса.The hint cannot be used with more than one index hint.
  • Указание запрещает оптимизатору использовать пространственные индексы и XML-индексы таблицы.The hint prevents the optimizer from considering any spatial or XML indexes on the table.
  • Указание не может задаваться для удаленного источника данных.The hint cannot be specified for a remote data source.
  • Указание не может задаваться в сочетании с указанием FORCESEEK.The hint cannot be specified in combination with the FORCESEEK hint.

HOLDLOCKHOLDLOCK
Равнозначен аргументу SERIALIZABLE.Is equivalent to SERIALIZABLE. Дополнительные сведения об аргументе SERIALIZABLE см. далее в этом разделе.For more information, see SERIALIZABLE later in this topic. Аргумент HOLDLOCK применяется только к таблице или представлению, для которых он задан, и только на время транзакции, определенной в использующей его инструкции.HOLDLOCK applies only to the table or view for which it is specified and only for the duration of the transaction defined by the statement that it is used in. Аргумент HOLDLOCK нельзя использовать в инструкции SELECT, включающей параметр FOR BROWSE.HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.

IGNORE_CONSTRAINTSIGNORE_CONSTRAINTS
Применяется только в инструкции INSERT, когда параметр BULK используется с OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Указывает, что при операции массового импорта будут пропускаться какие-либо ограничения на таблицу.Specifies that any constraints on the table are ignored by the bulk-import operation. По умолчанию INSERT проверяет ограничения уникальности и проверочные ограничения и ограничения первичных и внешних ключей.By default, INSERT checks Unique Constraints and Check Constraints and Primary and Foreign Key Constraints. Если для операции массового импорта задан параметр IGNORE_CONSTRAINTS, инструкция INSERT будет пропускать ограничения в целевой таблице.When IGNORE_CONSTRAINTS is specified for a bulk-import operation, INSERT must ignore these constraints on a target table. Обратите внимание, что нельзя отключить ограничения UNIQUE, PRIMARY KEY или NOT NULL.Note that you cannot disable UNIQUE, PRIMARY KEY, or NOT NULL constraints.

Отключение ограничений CHECK и FOREIGN KEY может потребоваться, если введенные данные содержат нарушающие ограничения строки.You might want to disable CHECK and FOREIGN KEY constraints if the input data contains rows that violate constraints. При отключении ограничений CHECK и FOREIGN KEY можно импортировать данные, а затем произвести очистку данных с помощью инструкций Transact-SQLTransact-SQL.By disabling the CHECK and FOREIGN KEY constraints, you can import the data and then use Transact-SQLTransact-SQL statements to clean up the data.

Однако при пропуске ограничений CHECK и FOREIGN KEY после операции каждое пропущенное ограничение помечается как is_not_trusted в представлении каталога sys.check_constraints или sys.foreign_keys.However, when CHECK and FOREIGN KEY constraints are ignored, each ignored constraint on the table is marked as is_not_trusted in the sys.check_constraints or sys.foreign_keys catalog view after the operation. Рано или поздно придется проверить всю таблицу на соответствие ограничениям.At some point, you should check the constraints on the whole table. Если таблица не была пустой перед операцией массового импорта, затраты на повторную проверку ограничений могут превысить затраты от применения ограничений CHECK и FOREIGN KEY к добавочным данным.If the table was not empty before the bulk import operation, the cost of revalidating the constraint may exceed the cost of applying CHECK and FOREIGN KEY constraints to the incremental data.

IGNORE_TRIGGERSIGNORE_TRIGGERS
Применяется только в инструкции INSERT, когда параметр BULK используется с OPENROWSET.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

Указывает, что при операции объемного импорта не будут учитываться какие-либо триггеры, определенные для таблицы.Specifies that any triggers defined on the table are ignored by the bulk-import operation. По умолчанию для инструкции INSERT применяются триггеры.By default, INSERT applies triggers.

Аргумент IGNORE_TRIGGERS следует использовать только в случае, когда приложение не зависит от каких-либо триггеров и важно максимизировать производительность.Use IGNORE_TRIGGERS only if your application does not depend on any triggers and maximizing performance is important.

NOLOCKNOLOCK
Равнозначен аргументу READUNCOMMITTED.Is equivalent to READUNCOMMITTED. Дополнительные сведения об аргументе READUNCOMMITTED см. далее в этом разделе.For more information, see READUNCOMMITTED later in this topic.

Примечание

Для инструкций UPDATE и DELETE. Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

NOWAITNOWAIT
Указывает компоненту Компонент Database EngineDatabase Engine вернуть сообщение сразу после наложения блокировки на таблицу.Instructs the Компонент Database EngineDatabase Engine to return a message as soon as a lock is encountered on the table. Аргумент NOWAIT равнозначен указанию SET LOCK_TIMEOUT 0 для конкретной таблицы.NOWAIT is equivalent to specifying SET LOCK_TIMEOUT 0 for a specific table. Указание NOWAIT не работает, если также используется указание TABLOCK.The NOWAIT hint does not work when the TABLOCK hint is also included. Для прерывания запроса без ожидания при использовании указания TABLOCK предварите запрос следующим: SETLOCK_TIMEOUT 0;.To terminate a query without waiting when using the TABLOCK hint, preface the query with SETLOCK_TIMEOUT 0; instead.

PAGLOCKPAGLOCK
Применяет блокировку страниц вместо стандартной блокировки строк или ключей, а также вместо блокировки отдельной таблицы.Takes page locks either where individual locks are ordinarily taken on rows or keys, or where a single table lock is ordinarily taken. По умолчанию используется режим блокировки, соответствующий операции.By default, uses the lock mode appropriate for the operation. При указании блокировок в транзакциях, выполняемых с уровнем изоляции SNAPSHOT, они применяются только в том случае, когда подсказка PAGLOCK используется в сочетании с другими табличными подсказками, требующими блокировки, например UPDLOCK или HOLDLOCK.When specified in transactions operating at the SNAPSHOT isolation level, page locks are not taken unless PAGLOCK is combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

READCOMMITTEDREADCOMMITTED
Указывает, что операции чтения соответствуют правилам для уровня изоляции READ COMMITTED путем использования блокировки или управления версиями строк.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using either locking or row versioning. Если параметр базы данных READ_COMMITTED_SNAPSHOT установлен в значение OFF, компонент Компонент Database EngineDatabase Engine устанавливает совмещаемую блокировку по мере чтения данных и снимает блокировку при завершении операции чтения.If the database option READ_COMMITTED_SNAPSHOT is OFF, the Компонент Database EngineDatabase Engine acquires shared locks as data is read and releases those locks when the read operation is completed. Если значение параметра базы данных READ_COMMITTED_SNAPSHOT равно ON, компонент Компонент Database EngineDatabase Engine не накладывает блокировок и использует управление версиями строк.If the database option READ_COMMITTED_SNAPSHOT is ON, the Компонент Database EngineDatabase Engine does not acquire locks and uses row versioning. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Примечание

Для инструкций UPDATE и DELETE. Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

READCOMMITTEDLOCKREADCOMMITTEDLOCK
Указывает, что операции чтения соответствуют правилам для уровня изоляции READ COMMITTED путем использования блокировки.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using locking. Компонент Компонент Database EngineDatabase Engine накладывает совмещаемые блокировки по мере чтения данных и снимает их после завершения операции чтения вне зависимости от значения параметра базы данных READ_COMMITTED_SNAPSHOT.The Компонент Database EngineDatabase Engine acquires shared locks as data is read and releases those locks when the read operation is completed, regardless of the setting of the READ_COMMITTED_SNAPSHOT database option. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL). Это указание не может задаваться в целевой таблице инструкции INSERT, в таком случае возвращается ошибка 4140.This hint cannot be specified on the target table of an INSERT statement; error 4140 is returned.

READPASTREADPAST
Указывает, что компонент Компонент Database EngineDatabase Engine не считывает строки и страницы, заблокированные другими транзакциями.Specifies that the Компонент Database EngineDatabase Engine not read rows that are locked by other transactions. Если указан аргумент READPAST, блокировки уровня строк будут пропускаться, а блокировки уровня страниц — не будут.When READPAST is specified, row-level locks are skipped but page-level locks are not skipped. Компонент Компонент Database EngineDatabase Engine будет пропускать строки вместо блокировки текущей транзакции до тех пор, пока блокировки не будут сняты.That is, the Компонент Database EngineDatabase Engine skips past the rows instead of blocking the current transaction until the locks are released. Например, предположим, что в таблице T1 есть один целочисленный столбец со значениями 1, 2, 3, 4, 5.For example, assume table T1 contains a single integer column with the values of 1, 2, 3, 4, 5. Если транзакция A изменит значение 3 на 8, но еще не будет зафиксирована, то инструкция SELECT * FROM T1 (READPAST) возвратит значения 1, 2, 4, 5.If transaction A changes the value of 3 to 8 but has not yet committed, a SELECT * FROM T1 (READPAST) yields values 1, 2, 4, 5. Параметр READPAST главным образом используется для устранения конфликта блокировок при реализации рабочей очереди, использующей таблицу SQL ServerSQL Server.READPAST is primarily used to reduce locking contention when implementing a work queue that uses a SQL ServerSQL Server table. Средство чтения очереди, использующее аргумент READPAST, пропускает прошлые записи очереди, заблокированные другими транзакциями, до следующей доступной записи очереди, не дожидаясь, пока другие транзакции снимут свои блокировки.A queue reader that uses READPAST skips past queue entries locked by other transactions to the next available queue entry, without having to wait until the other transactions release their locks.

Аргумент READPAST можно задать для любой таблицы, к которой обращается инструкция UPDATE или DELETE, и к любой таблице, на которую ссылается предложение FROM.READPAST can be specified for any table referenced in an UPDATE or DELETE statement, and any table referenced in a FROM clause. Если аргумент READPAST задан в инструкции UPDATE, он применяется только при считывании данных для идентификации подлежащих обновлению записей вне зависимости от того, где он указан в инструкции.When specified in an UPDATE statement, READPAST is applied only when reading data to identify which records to update, regardless of where in the statement it is specified. Аргумент READPAST для таблиц из предложения INTO инструкции INSERT задать нельзя.READPAST cannot be specified for tables in the INTO clause of an INSERT statement. Операции обновления или удаления, использующие аргумент READPAST, могут блокироваться либо при считывании внешних ключей или индексированных представлений, либо при изменении вторичных индексов.Update or delete operations that use READPAST may block when reading foreign keys or indexed views, or when modifying secondary indexes.

Аргумент READPAST можно указывать только в транзакциях, выполняемых на уровнях изоляции READ COMMITTED или REPEATABLE READ.READPAST can only be specified in transactions operating at the READ COMMITTED or REPEATABLE READ isolation levels. При указании подсказки READPAST в транзакциях, выполняемых с уровнем изоляции SNAPSHOT, она должна использоваться в сочетании с другими табличными подсказками, требующими блокировки, например UPDLOCK или HOLDLOCK.When specified in transactions operating at the SNAPSHOT isolation level, READPAST must be combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

Табличное указание READPAST нельзя указать, если для параметра базы данных READ_COMMITTED_SNAPSHOT установлено значение ON и выполняется одно из следующих условий:The READPAST table hint cannot be specified when the READ_COMMITTED_SNAPSHOT database option is set to ON and either of the following conditions is true:

  • Уровень изоляции транзакций сеанса имеет значение READ COMMITTED.The transaction isolation level of the session is READ COMMITTED.
  • В запросе также указана табличная подсказка READCOMMITTED.The READCOMMITTED table hint is also specified in the query.

Чтобы в этих случаях указать подсказку READPAST, удалите табличную подсказку READCOMMITTED (если существует) и включите в запрос табличную подсказку READCOMMITTEDLOCK.To specify the READPAST hint in these cases, remove the READCOMMITTED table hint if present, and include the READCOMMITTEDLOCK table hint in the query.

READUNCOMMITTEDREADUNCOMMITTED
Указывает, что чтение недействительных результатов разрешено.Specifies that dirty reads are allowed. Для предотвращения ситуаций, когда другие транзакции изменяют данные, считанные текущей транзакцией, не накладываются совмещаемые блокировки, а монопольные блокировки других транзакций не мешают текущей транзакции считывать заблокированные данные.No shared locks are issued to prevent other transactions from modifying data read by the current transaction, and exclusive locks set by other transactions do not block the current transaction from reading the locked data. Разрешение чтения измененных результатов может привести к повышению параллелизма за счет считывания изменений данных, откат которых произведен другими транзакциями.Allowing dirty reads can cause higher concurrency, but at the cost of reading data modifications that then are rolled back by other transactions. Это в свою очередь может сопровождаться ошибками транзакции, представлением пользователю незафиксированных данных, повторным появлением некоторых записей или их отсутствием.This may generate errors for your transaction, present users with data that was never committed, or cause users to see records twice (or not at all).

Указания READUNCOMMITTED и NOLOCK применяются только к блокировкам данных.READUNCOMMITTED and NOLOCK hints apply only to data locks. Все запросы, включая запросы с указаниями READUNCOMMITTED и NOLOCK, получают блокировку Sch-S (стабильность схемы) в процессе компиляции и выполнения.All queries, including those with READUNCOMMITTED and NOLOCK hints, acquire Sch-S (schema stability) locks during compilation and execution. Поэтому запросы блокируются, если параллельная транзакция удерживает в таблице блокировку Sch-M (изменение схемы).Because of this, queries are blocked when a concurrent transaction holds a Sch-M (schema modification) lock on the table. Например, операция языка DDL получает блокировку Sch-M до того, как она изменяет данные схемы.For example, a data definition language (DDL) operation acquires a Sch-M lock before it modifies the schema information of the table. Все параллельные запросы, включая выполняемые с указаниями READUNCOMMITTED или NOLOCK, блокируются при попытке получить блокировку Sch-S.Any concurrent queries, including those running with READUNCOMMITTED or NOLOCK hints, are blocked when attempting to acquire a Sch-S lock. И наоборот, запрос, удерживающий блокировку Sch-S, блокирует параллельную транзакцию, которая пытается получить блокировку Sch-M.Conversely, a query holding a Sch-S lock blocks a concurrent transaction that attempts to acquire a Sch-M lock.

Подсказки READUNCOMMITTED и NOLOCK для таблиц, измененных операциями вставки, обновления или удаления, указать нельзя.READUNCOMMITTED and NOLOCK cannot be specified for tables modified by insert, update, or delete operations. Оптимизатор запросов SQL ServerSQL Server не учитывает подсказки READUNCOMMITTED и NOLOCK в предложении FROM, применяемые к целевой таблице инструкции UPDATE или DELETE.The SQL ServerSQL Server query optimizer ignores the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement.

Примечание

Поддержка использования подсказок READUNCOMMITTED и NOLOCK в предложении FROM, применяемом к целевой таблице инструкции UPDATE или DELETE, будет удалена в следующей версии SQL ServerSQL Server.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. Следует избегать использования этих указаний в таком контексте в новой разработке и запланировать изменение приложений, использующих их в настоящий момент.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

Минимизировать состязание блокировок во время защиты транзакций от «грязных» чтений незафиксированных изменений данных можно следующими способами.You can minimize locking contention while protecting transactions from dirty reads of uncommitted data modifications by using either of the following:

  • Уровень изоляции READ COMMITTED с параметром базы данных READ_COMMITTED_SNAPSHOT, установленным в значение ON.The READ COMMITTED isolation level with the READ_COMMITTED_SNAPSHOT database option set ON.
  • Уровень изоляции моментального снимка (SNAPSHOT).The SNAPSHOT isolation level.

Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Примечание

Если выдается сообщение об ошибке 601 при заданном параметре READUNCOMMITTED, ее следует разрешить так же, как и ошибку взаимоблокировки (1205), и затем повторить инструкцию.If you receive the error message 601 when READUNCOMMITTED is specified, resolve it as you would a deadlock error (1205), and retry your statement.

REPEATABLEREADREPEATABLEREAD
Указывает, что просмотр выполняется с той же семантикой блокировки, что и транзакция, запущенная на уровне изоляции REPEATABLE READ.Specifies that a scan is performed with the same locking semantics as a transaction running at REPEATABLE READ isolation level. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

ROWLOCKROWLOCK
Указывает, что вместо блокировки страниц или таблиц применяются блокировки строк.Specifies that row locks are taken when page or table locks are ordinarily taken. При указании блокировок строк в транзакциях, выполняемых на уровне изоляции SNAPSHOT, они применяются только в случае, когда подсказка ROWLOCK используется в сочетании с другими табличными подсказками, требующими блокировки, например UPDLOCK или HOLDLOCK.When specified in transactions operating at the SNAPSHOT isolation level, row locks are not taken unless ROWLOCK is combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

SERIALIZABLESERIALIZABLE
Равнозначен аргументу HOLDLOCK.Is equivalent to HOLDLOCK. Накладывает дополнительные ограничения на совмещаемую блокировку: удерживает ее до завершения транзакции вместо снятия блокировки сразу после того, как таблица или страница данных больше не требуется, независимо от того, завершена ли транзакция.Makes shared locks more restrictive by holding them until a transaction is completed, instead of releasing the shared lock as soon as the required table or data page is no longer needed, whether the transaction has been completed or not. Просмотр выполняется с той же семантикой, что и транзакция, запущенная на уровне изоляции SERIALIZABLE.The scan is performed with the same semantics as a transaction running at the SERIALIZABLE isolation level. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

SNAPSHOTSNAPSHOT
Применимо к: с SQL Server 2014 (12.x)SQL Server 2014 (12.x) до SQL Server 2017SQL Server 2017.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017.

Доступ к таблице, оптимизированной для памяти, выполняется с изоляцией SNAPSHOT.The memory-optimized table is accessed under SNAPSHOT isolation. SNAPSHOT может использоваться только с таблицами, оптимизированными для памяти (не с дисковыми таблицами).SNAPSHOT can only be used with memory-optimized tables (not with disk-based tables). Дополнительные сведения см. в разделе Введение в таблицы, оптимизированные для памяти.For more information, see Introduction to Memory-Optimized Tables.

SELECT * FROM dbo.Customers AS c   
WITH (SNAPSHOT)   
LEFT JOIN dbo.[Order History] AS oh   
    ON c.customer_id=oh.customer_id;  

SPATIAL_WINDOW_MAX_CELLS = целое числоSPATIAL_WINDOW_MAX_CELLS = integer
Применимо к: с 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.
Указывает максимальное количество ячеек, используемых для тесселяции геометрического или географического объекта.Specifies the maximum number of cells to use for tessellating a geometry or geography object. number — значение от 1 до 8192.number is a value between 1 and 8192.

Этот параметр позволяет выполнять тонкую настройку времени выполнения запроса за счет настройки компромисса между временем выполнения первичного и вторичного фильтра.This option allows for fine-tuning of query execution time by adjusting the tradeoff between primary and secondary filter execution time. Чем больше число, тем меньше время выполнения вторичного фильтра и больше время выполнения первичного фильтра, и наоборот.A larger number reduces secondary filter execution time, but increases primary execution filter time and a smaller number decreases primary filter execution time, but increase secondary filter execution. Для получения более плотных пространственных данных большее число должно давать большее время выполнения за счет лучшего приближения с первичным фильтром и сокращения времени выполнения вторичного фильтра.For denser spatial data, a higher number should produce a faster execution time by giving a better approximation with the primary filter and reducing secondary filter execution time. Для получения более разреженных данных меньшее число сократит время выполнения первичного фильтра.For sparser data, a lower number will decrease the primary filter execution time.

Этот параметр работает и в ручной и в автоматической тесселяции сетки.This option works for both manual and automatic grid tessellations.

TABLOCKTABLOCK
Указывает, что полученная блокировка применяется на уровне таблицы.Specifies that the acquired lock is applied at the table level. Тип полученной блокировки зависит от того, какая инструкция выполняется.The type of lock that is acquired depends on the statement being executed. Например, инструкция SELECT может потребовать совмещаемой блокировки.For example, a SELECT statement may acquire a shared lock. При указании TABLOCK совмещаемая блокировка применяется ко всей таблице, а не на уровне строк или страниц.By specifying TABLOCK, the shared lock is applied to the entire table instead of at the row or page level. Если также указано HOLDLOCK, то блокировка таблицы удерживается до конца транзакции.If HOLDLOCK is also specified, the table lock is held until the end of the transaction.

Во время импорта данных в кучу с помощью инструкции INSERT INTO <target_table> SELECT <columns> FROM <source_table> statement можно включить оптимизированное ведение журнала и блокировки для инструкции, задав для целевой таблицы указание TABLOCK.When importing data into a heap by using the INSERT INTO <target_table> SELECT <columns> FROM <source_table> statement, you can enable optimized logging and locking for the statement by specifying the TABLOCK hint for the target table. Кроме того, для базы данных должна быть задана простая модель восстановления или модель восстановления с неполным протоколированием.In addition, the recovery model of the database must be set to simple or bulk-logged. Дополнительные сведения см. в статье INSERT (Transact-SQL).For more information, see INSERT (Transact-SQL).

При использовании с поставщиком больших наборов строк OPENROWSET для импорта данных в таблицу указание TABLOCK позволяет нескольким клиентам параллельно загружать данные в целевую таблицу с оптимизацией записи в журнал и блокировки.When used with the OPENROWSET bulk rowset provider to import data into a table, TABLOCK enables multiple clients to concurrently load data into the target table with optimized logging and locking. Дополнительные сведения см. в разделе Предварительные условия для минимального протоколирования массового импорта данных.For more information, see Prerequisites for Minimal Logging in Bulk Import.

TABLOCKXTABLOCKX
Указывает, что к таблице применяется монопольная блокировка.Specifies that an exclusive lock is taken on the table.

UPDLOCKUPDLOCK
Указывает, что блокировки обновления применяются и удерживаются до завершения транзакции.Specifies that update locks are to be taken and held until the transaction completes. UPDLOCK получает блокировки обновления для операций чтения только на уровне строк или страниц.UPDLOCK takes update locks for read operations only at the row-level or page-level. Если UPDLOCK используется в сочетании с TABLOCK или по какой-либо другой причине уже получена блокировка на уровне таблицы, то вместо них будет получена монопольная (X) блокировка.If UPDLOCK is combined with TABLOCK, or a table-level lock is taken for some other reason, an exclusive (X) lock will be taken instead.

Если указано UPDLOCK, то указания уровня изоляции READCOMMITTED и READCOMMITTEDLOCK не учитываются.When UPDLOCK is specified, the READCOMMITTED and READCOMMITTEDLOCK isolation level hints are ignored. Например, если уровень изоляции в данном сеансе установлен в SERIALIZABLE и в запросе указано (UPDLOCK, READCOMMITTED), то указание READCOMMITTED не учитывается и транзакция будет выполняться на уровне изоляции SERIALIZABLE.For example, if the isolation level of the session is set to SERIALIZABLE and a query specifies (UPDLOCK, READCOMMITTED), the READCOMMITTED hint is ignored and the transaction is run using the SERIALIZABLE isolation level.

XLOCKXLOCK
Указывает, что монопольные блокировки применяются и удерживаются до завершения транзакции.Specifies that exclusive locks are to be taken and held until the transaction completes. Если при этом указан аргумент ROWLOCK, PAGLOCK или TABLOCK, монопольная блокировка применяется к соответствующему уровню гранулярности.If specified with ROWLOCK, PAGLOCK, or TABLOCK, the exclusive locks apply to the appropriate level of granularity.

RemarksRemarks

Табличные указания пропускаются, если доступ к таблице не предусмотрен планом запроса.The table hints are ignored if the table is not accessed by the query plan. Это может быть вызвано тем, что оптимизатор вообще отказался от доступа к таблице или вместо этого получает доступ к индексированному представлению.This may be caused by the optimizer choosing not to access the table at all, or because an indexed view is accessed instead. В последнем случае доступ к индексированному представлению можно предотвратить с помощью подсказки в запросе OPTION (EXPAND VIEWS).In the latter case, accessing an indexed view can be prevented by using the OPTION (EXPAND VIEWS) query hint.

Все подсказки блокировки распространяются на все таблицы и представления, к которым имеет доступ данный план запроса, в том числе в таблицы и представления, на которые ссылается данное представление.All lock hints are propagated to all the tables and views that are accessed by the query plan, including tables and views referenced in a view. Кроме того, SQL ServerSQL Server выполняет соответствующие проверки согласованности блокировок.Also, SQL ServerSQL Server performs the corresponding lock consistency checks.

Указания блокировки ROWLOCK, UPDLOCK и XLOCK, накладывающие блокировку уровня строки, могут накладывать блокировки на ключи индекса вместо фактических строк данных.Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on index keys rather than the actual data rows. Например, если для таблицы имеется некластеризованный индекс, а инструкция SELECT обрабатывается покрывающим индексом с использованием подсказки блокировки, блокировка накладывается на ключ покрывающего индекса вместо строки данных в базовой таблице.For example, if a table has a nonclustered index, and a SELECT statement using a lock hint is handled by a covering index, a lock is acquired on the index key in the covering index rather than on the data row in the base table.

Если таблица содержит вычисляемые столбцы, которые вычисляются выражениями или функциями, получающими доступ к столбцам других таблиц, то в таких таблицах табличные подсказки не используются и не распространяются.If a table contains computed columns that are computed by expressions or functions accessing columns in other tables, the table hints are not used on those tables and are not propagated. Например, в запросе указана табличная подсказка NOLOCK для таблицы.For example, a NOLOCK table hint is specified on a table in the query. В этой таблице есть столбцы, вычисляемые с помощью сочетания выражений и функций, получающих доступ к столбцам другой таблицы.This table has computed columns that are computed by a combination of expressions and functions that access columns in another table. При доступе к таблицам, на которые ссылаются выражения и функции, табличное указание NOLOCK не используется.The tables referenced by the expressions and functions do not use the NOLOCK table hint when accessed.

SQL ServerSQL Server не разрешает более одного табличного указания из каждой из следующих групп в каждой из таблиц в предложении FROM. does not allow for more than one table hint from each of the following groups for each table in the FROM clause:

  • Подсказки степени гранулярности: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK или TABLOCKX.Granularity hints: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK, or TABLOCKX.
  • Подсказки уровня изоляции: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.Isolation level hints: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Подсказки отфильтрованного индексаFiltered Index Hints

Отфильтрованный индекс можно использовать в качестве табличной подсказки, но, если он не распространяется на все выбранные запросом строки, оптимизатор запросов выдаст ошибку 8622.A filtered index can be used as a table hint, but will cause the query optimizer to generate error 8622 if it does not cover all of the rows that the query selects. Далее приводится пример недопустимого указания отфильтрованного индекса.The following is an example of an invalid filtered index hint. В примере создается отфильтрованный индекс FIBillOfMaterialsWithComponentID, который затем используется как подсказка индекса для инструкции SELECT.The example creates the filtered index FIBillOfMaterialsWithComponentID and then uses it as an index hint for a SELECT statement. Предикат отфильтрованного индекса содержит строки данных для ComponentID со значениями 533, 324 и 753.The filtered index predicate includes data rows for ComponentIDs 533, 324, and 753. Предикат запроса также содержит строки данных для ComponentID со значениями 533, 324 и 753, но расширяет результирующий набор на ComponentID со значениями 855 и 924, которые отсутствуют в отфильтрованном индексе.The query predicate also includes data rows for ComponentIDs 533, 324, and 753 but extends the result set to include ComponentIDs 855 and 924, which are not in the filtered index. Поэтому оптимизатор запросов не может использовать указание отфильтрованного индекса и формирует ошибку 8622.Therefore, the query optimizer cannot use the filtered index hint and generates error 8622. Дополнительные сведения см. в разделе Create Filtered Indexes.For more information, see Create Filtered Indexes.

IF EXISTS (SELECT name FROM sys.indexes  
    WHERE name = N'FIBillOfMaterialsWithComponentID'   
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))  
DROP INDEX FIBillOfMaterialsWithComponentID  
    ON Production.BillOfMaterials;  
GO  
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithComponentID"  
    ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)  
    WHERE ComponentID IN (533, 324, 753);  
GO  
SELECT StartDate, ComponentID FROM Production.BillOfMaterials  
    WITH( INDEX (FIBillOfMaterialsWithComponentID) )  
    WHERE ComponentID in (533, 324, 753, 855, 924);  
GO  

Оптимизатор запросов не учитывает указание индекса, если в параметрах SET отсутствуют значения, необходимые для отфильтрованных индексов.The query optimizer will not consider an index hint if the SET options do not have the required values for filtered indexes. Дополнительные сведения см. в разделе CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

Использование NOEXPANDUsing NOEXPAND

Аргумент NOEXPAND применяется только для индексированных представлений.NOEXPAND applies only to indexed views. Индексированное представление — это представление с созданным на нем уникальным кластеризованным индексом.An indexed view is a view with a unique clustered index created on it. Если запрос содержит ссылки на столбцы, присутствующие как в индексированном представлении, так и в базовых таблицах, а оптимизатор запросов определяет, что использование индексированного представления является лучшим методом выполнения запроса, оптимизатор будет использовать индекс представления.If a query contains references to columns that are present both in an indexed view and base tables, and the query optimizer determines that using the indexed view provides the best method for executing the query, the query optimizer uses the index on the view. Эта функциональная возможность называется сопоставлением индексированного представления.This functionality is called indexed view matching. До SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 автоматическое использование индексированного представления оптимизатором запросов поддерживается только в определенных выпусках SQL ServerSQL Server.Prior to SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, automatic use of an indexed view by the query optimizer is supported only in specific editions of SQL ServerSQL Server. Сведения о функциях, поддерживаемых различными выпусками SQL ServerSQL Server, см. в статье Возможности, поддерживаемые выпусками SQL Server 2016.For a list of features that are supported by the editions of SQL ServerSQL Server, see Features Supported by the Editions of SQL Server 2016.

Однако, чтобы оптимизатор учитывал индексированные представления для согласования или использовал индексированное представление, обращение к которому производится с подсказкой NOEXPAND, нужно установить в ON следующие параметры SET.However, for the optimizer to consider indexed views for matching, or use an indexed view that is referenced with the NOEXPAND hint, the following SET options must be set to ON.

Примечание

База данных SQL AzureAzure SQL Database поддерживает автоматическое использование индексированного представления без указания NOEXPAND. supports automatic use of indexed views without specifying the NOEXPAND hint.

ANSI_NULLSANSI_NULLS ANSI_WARNINGSANSI_WARNINGS CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL
ANSI_PADDINGANSI_PADDING ARITHABORT1ARITHABORT1 QUOTED_IDENTIFIERQUOTED_IDENTIFIER

1 Параметр ARITHABORT неявным образом получает значение ON, когда для ANSI_WARNINGS устанавливается ON.1 ARITHABORT is implicitly set to ON when ANSI_WARNINGS is set to ON. Поэтому менять этот параметр вручную не обязательно.Therefore, you do not have to manually adjust this setting.

Кроме того, параметр NUMERIC_ROUNDABORT нужно установить в OFF.Also, the NUMERIC_ROUNDABORT option must be set to OFF.

Чтобы заставить оптимизатор использовать индекс для индексированного представления, следует указать параметр NOEXPAND.To force the optimizer to use an index for an indexed view, specify the NOEXPAND option. Это указание можно использовать только в случае, если представление также названо в запросе.This hint can be used only if the view is also named in the query. В SQL ServerSQL Server отсутствует указание, которое принудительно бы использовало конкретное индексированное представление в запросе, в котором имя представления явно не названо в предложении FROM, однако оптимизатор запросов рассматривает возможность использования индексированных представлений, даже если запрос не обращается к ним напрямую. SQL ServerSQL Server does not provide a hint to force a particular indexed view to be used in a query that does not name the view directly in the FROM clause; however, the query optimizer considers using indexed views, even if they are not referenced directly in the query.

Использование табличного указания в качестве указания запросаUsing a Table Hint as a Query Hint

Табличные указания могут использоваться в качестве указаний запроса с помощью предложения OPTION (TABLE HINT).Table hints can also be specified as a query hint by using the OPTION (TABLE HINT) clause. Табличные указания рекомендуется использовать в качестве подсказок в запросах только в контексте структуры плана.We recommend using a table hint as a query hint only in the context of a plan guide. Для нерегламентированных запросов эти указания следует задавать как табличные указания.For ad-hoc queries, specify these hints only as table hints. Дополнительные сведения см. в разделе Указания запросов (Transact-SQL).For more information, see Query Hints (Transact-SQL).

РазрешенияPermissions

Для указаний KEEPIDENTITY, IGNORE_CONSTRAINTS и IGNORE_TRIGGERS требуются разрешения ALTER на таблицу.The KEEPIDENTITY, IGNORE_CONSTRAINTS, and IGNORE_TRIGGERS hints require ALTER permissions on the table.

ПримерыExamples

A.A. Использование подсказки TABLOCK для указания метода блокировкиUsing the TABLOCK hint to specify a locking method

В следующем примере показано, как на таблицу Production.Product в базе данных AdventureWorks2012AdventureWorks2012 накладывается совмещаемая блокировка, удерживаемая до завершения инструкции UPDATE.The following example specifies that a shared lock is taken on the Production.Product table in the AdventureWorks2012AdventureWorks2012 database and is held until the end of the UPDATE statement.

UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

Б.B. Использование указания FORCESEEK для указания операции поиска в индексеUsing the FORCESEEK hint to specify an index seek operation

В следующем примере показано использование указания FORCESEEK без указания индекса, предписывающее оптимизатору запросов выполнять операцию поиска в индексе для таблицы Sales.SalesOrderDetail в базе данных AdventureWorks2012AdventureWorks2012.The following example uses the FORCESEEK hint without specifying an index to force the query optimizer to perform an index seek operation on the Sales.SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database.

SELECT *  
FROM Sales.SalesOrderHeader AS h  
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)  
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);  
GO  

В следующем примере указание FORCESEEK с индексом предписывает оптимизатору запросов выполнить операцию поиска по указанному индексу и столбцу индекса.The following example uses the FORCESEEK hint with an index to force the query optimizer to perform an index seek operation on the specified index and index column.

SELECT h.SalesOrderID, h.TotalDue, d.OrderQty  
FROM Sales.SalesOrderHeader AS h  
    INNER JOIN Sales.SalesOrderDetail AS d   
    WITH (FORCESEEK (PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (SalesOrderID)))   
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);   
GO  

В.C. Использование указания FORCESCAN для назначения операции просмотра индексаUsing the FORCESCAN hint to specify an index scan operation

В следующем примере показано использование указания FORCESCAN, предписывающего оптимизатору запросов принудительно выполнить операцию просмотра в таблице Sales.SalesOrderDetail в базе данных AdventureWorks2012AdventureWorks2012.The following example uses the FORCESCAN hint to force the query optimizer to perform a scan operation on the Sales.SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database.

SELECT h.SalesOrderID, h.TotalDue, d.OrderQty  
FROM Sales.SalesOrderHeader AS h  
    INNER JOIN Sales.SalesOrderDetail AS d   
    WITH (FORCESCAN)   
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);  

См. также:See Also

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