Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
SQL в базе данных Microsoft Fabric
Указания таблиц используются для переопределения поведения оптимизатора запросов по умолчанию во время инструкции языка обработки данных (DML). Можно указать метод блокировки, один или несколько индексов, операцию обработки запросов, например сканирование таблицы или поиск индекса или другие параметры. Указания таблиц указываются в предложении инструкции DML и влияют только на таблицу или представление, на которые ссылается это предложение.
Caution
Так как оптимизатор запросов SQL Server обычно выбирает оптимальный план выполнения для запроса, мы рекомендуем использовать указания только в качестве последнего средства опытными разработчиками и администраторами баз данных.
Относится к:
- DELETE
- INSERT
- SELECT
- UPDATE
- MERGE
Transact-SQL соглашения о синтаксисе
Syntax
WITH ( <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_value>
| 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 ]
При некоторых исключениях табличные подсказки поддерживаются в предложении только в том случае, если указания указаны с ключевым словом . Табличные указания также необходимо заключать в скобки.
Important
Опущение ключевого слова WITH является нерекомендуемой функцией: эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
Подсказки в следующей таблице можно использовать как с ключевым словом , так и без него: , , , , , , , , , , , , , и . Если эти указания таблицы указаны без ключевого слова, указания должны быть указаны только. Рассмотрим пример.
FROM t (TABLOCK)
Если указание указано с другим параметром, указание должно быть указано с ключевым словом :
FROM t WITH (TABLOCK, INDEX(myindex))
Между табличными подсказками рекомендуется ставить запятые.
Important
Разделяя указания по пробелам, а не запятыми, является устаревшей функцией: эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
NOEXPAND
Указывает, что индексированные представления не расширяются для доступа к базовым таблицам при обработке запроса оптимизатором запросов. Оптимизатор запросов обрабатывает представление так же, как и таблицу с кластеризованным индексом. применяется только к индексированных представлениям. Дополнительные сведения см. в разделе Use NOEXPAND.
INDEX ( index_value [ , ... n ] ) | INDEX = ( index_value )
Синтаксис задает имена или идентификаторы одного или нескольких индексов, которые будут использоваться оптимизатором запросов при обработке инструкции. Альтернативный синтаксис определяет отдельное значение индекса. Для каждой таблицы можно задать только одно указание индекса.
Если кластеризованный индекс существует, принудительно выполняет кластеризованную проверку индекса и принудительно выполняет кластеризованную проверку или поиск индекса. Если кластеризованный индекс не существует, выполняет проверку таблицы и интерпретируется как ошибка.
Если в одном списке подсказок используются несколько индексов, дубликаты игнорируются, а остальные перечисленные индексы используются для извлечения строк таблицы. Порядок индексов в указании индекса имеет значение. Несколько указаний индекса также принудительно выполняют операции И с индексами, и оптимизатор запросов применяет столько условий, сколько возможно для каждого из индексов, к которым он получает доступ. Если коллекция намеченных индексов не включает все столбцы, на которые ссылается запрос, выполняется получение оставшихся столбцов после того, как #REF! извлекает все индексированные столбцы.
Note
Если указание индекса, ссылающееся на несколько индексов, используется в таблице фактов в соединении типа «звезда», оптимизатор не учитывает индекс и возвращает предупреждение. Кроме того, индекс ORing не допускается для таблицы с указанным указанием индекса.
Максимальное число индексов в табличном указании равно 250 некластеризованным индексам.
KEEPIDENTITY
Применимо только в инструкции , если параметр используется с OPENROWSET(BULK).
Указывает, что значение или значения идентификаторов в файле импортированных данных будут использоваться для столбца идентификаторов. Если не задано, значения удостоверений для этого столбца проверяются, но не импортируются, а оптимизатор запросов автоматически назначает уникальные значения на основе значений начального и добавочного значения, указанные во время создания таблицы.
Important
Если файл данных не содержит значения для столбца удостоверений в таблице или представлении, а столбец удостоверений не является последним в таблице, необходимо пропустить столбец удостоверения. Дополнительные сведения см. в разделе Использование файла формата для пропуска поля данных (SQL Server). Если столбец идентификаторов успешно пропущен, то оптимизатор запросов автоматически назначает уникальные значения для столбца идентификаторов в импортируемые строки таблицы.
Пример использования этого указания в инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) см. в разделе Keep identity values при массовом импорте данных (SQL Server).
Сведения о проверке значения удостоверения для таблицы см. в DBCC CHECKIDENT.
KEEPDEFAULTS
Применимо только в инструкции , если параметр используется с OPENROWSET (BULK).
Указывает вставку значения по умолчанию столбца таблицы вместо , когда запись данных не имеет значения для столбца.
Пример использования этого указания в инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) см. в разделе Keep NULL или значения по умолчанию во время массового импорта (SQL Server).
FORCESEEK [ ( index_value ( index_column_name [ , ...n ] ) ]
Указывает, что оптимизатор запросов использует только операцию поиска индекса в качестве пути доступа к данным в таблице или представлении.
Note
Начиная с SQL Server 2008 R2 (10.50.x) с пакетом обновления 1 (SP1), также можно указать параметры индекса. В таком случае оптимизатор запросов будет использовать при выполнении операций поиска в индексе по указанному индексу как минимум все указанные столбцы индекса.
index_value
Имя индекса или значение идентификатора индекса. Не удается указать идентификатор индекса 0 (куча). Чтобы вернуть имя индекса или идентификатор, выполните запрос к представлению каталога.
index_column_name
Имя столбца индекса, включаемого в операцию поиска. Указание параметров индекса аналогично использованию с указанием . Но более эффективного контроля над путем доступа, который использует оптимизатор запросов, можно добиться указанием и индекса, в котором следует провести поиск, и столбцов индекса, которые предполагается использовать в операции поиска. При необходимости оптимизатор может рассмотреть больше столбцов. Например, если указан некластеризованный индекс, оптимизатор может использовать кластеризованные ключевые столбцы индекса в дополнение к указанным столбцам.
Указание можно указать следующими способами.
| Syntax | Example | Description |
|---|---|---|
| Без индекса или указания | FROM dbo.MyTable WITH (FORCESEEK) |
Оптимизатор запросов использует только операции поиска в индексе для доступа к таблицам или представлениям через любой подходящий индекс. |
| В сочетании с указанием | FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) |
Оптимизатор запросов будет использовать при доступе к таблице или представлению через указанный индекс только операции поиска по индексу. |
| Параметризация посредством указания индекса и столбцов индекса | FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) |
Оптимизатор запросов будет использовать при выполнении поиска по указанной таблице или представлению индексу как минимум указанные столбцы индекса. |
При использовании указания (с параметрами индекса или без нее ) рассмотрите следующие рекомендации:
- Указание может задаваться как табличное указание или как указание запроса. Дополнительные сведения о подсказках запросов см. в ПодсказкиQuery (Transact-SQL).
- Чтобы применить индексированное представление, необходимо также указать указание.
- Указание может применяться не более одного раза для каждой таблицы или представления.
- Указание невозможно указать для удаленного источника данных. Ошибка 7377 возвращается при указании индекса и возвращается ошибка 8180 при использовании без указания индекса.
- Если не удается найти планы, возвращается ошибка 8622.
При указании параметров индекса применяются следующие рекомендации и ограничения:
- Указание не может быть указано для таблицы, которая является целевым объектом инструкции , или .
- Указание не может быть указано в сочетании с указанием или другим указанием.
- Должен быть указан хотя бы один столбец, который должен быть ведущим ключевым столбцом.
- Однако можно указать дополнительные столбцы индекса, но нельзя пропускать ключевые столбцы. Например, если указанный индекс содержит ключевые столбцы , и , то правильный синтаксис должен содержать и . Неправильный синтаксис может содержать и .
- Порядок следования имен столбцов, заданный в указании, должен соответствовать порядку столбцов в упоминаемом индексе.
- Столбцы, которые не указаны в определении ключа индекса, не могут быть указаны. Например, в некластеризованном индексе могут быть указаны только определенные в индексе ключевые столбцы. Кластеризованные ключевые столбцы, автоматически включенные в индекс, не могут быть указаны, но могут использоваться оптимизатором.
- Индекс columnstore, оптимизированный для памяти xVelocity, нельзя указать в качестве параметра индекса. Возвращается ошибка 366.
- Изменение определения индекса (например, путем добавления или удаления столбцов) может потребовать изменения запросов, ссылающихся на этот индекс.
- Указание запрещает оптимизатору использовать пространственные индексы и XML-индексы таблицы.
- Указание не может быть указано в сочетании с указанием .
- Для секционированных индексов неявно добавленный SQL Server столбец секционирования нельзя указать в подсказке
FORCESEEK.
Caution
Указание параметров ограничивает количество планов, которые могут рассматриваться оптимизатором больше, чем при указании без параметров. Это может привести к возникновению ошибки в большем случае.
FORCESCAN
Применимо к: SQL Server 2008 R2 (10.50.x) с пакетом обновления 1 и более поздних версий
Указывает, что оптимизатор запросов использует только операцию сканирования индекса в качестве пути доступа к указанной таблице или представлению. Указание может быть полезно для запросов, в которых оптимизатор недооценивает количество затронутых строк и выбирает операцию поиска, а не операцию сканирования. Когда это происходит, объем памяти, предоставленной для операции, слишком мал, и производительность запросов влияет.
можно указать с указанием или без нее . При сочетании с указанием индекса (), оптимизатор запросов рассматривает только пути доступа по указанному индексу при доступе к указанной таблице. Можно указать с указанием индекса для принудительной операции сканирования таблиц в базовой таблице.
Для секционированных таблиц и индексов применяются после устранения секций с помощью оценки предиката запроса. Это означает, что сканирование выполняется только в оставшихся секциях, а не во всей таблице.
Указание имеет следующие ограничения:
- Указание не может быть указано для таблицы, которая является целевым объектом инструкции , или .
- Указание не может использоваться с несколькими указаниями индекса.
- Указание запрещает оптимизатору запросов рассматривать любые пространственные или XML-индексы в таблице.
- Указание невозможно указать для удаленного источника данных.
- Указание не может быть указано в сочетании с указанием .
HOLDLOCK
Эквивалент . Дополнительные сведения см. в разделе SERIALIZABLE далее в этой статье. применяется только к таблице или представлению, для которой она указана, и только в течение длительности транзакции, определенной инструкцией, в которой она используется. Нельзя использовать в инструкции SELECT, которая включает этот параметр.
IGNORE_CONSTRAINTS
Применимо только в инструкции , если параметр используется с OPENROWSET (BULK).
Указывает, что операция массового импорта игнорирует все ограничения таблицы. По умолчанию проверяет уникальных ограничений и проверяет ограничения и ограничения первичного и внешнего ключа. При указании для операции массового импорта должны игнорировать эти ограничения в целевой таблице. Нельзя отключить ограничения , или .
Может потребоваться отключить и ограничения, если входные данные содержат строки, которые нарушают ограничения. Отключив ограничения CHECK и FOREIGN KEY, можно импортировать данные и использовать инструкции Transact-SQL для очистки данных.
Однако если и ограничения игнорируются, каждое игнорируемое ограничение таблицы помечается как в представлении sys.check_constraints или sys.foreign_keys каталога после операции. Рано или поздно придется проверить всю таблицу на соответствие ограничениям. Если таблица не была пуста перед операцией массового импорта, стоимость повторного выполнения ограничения может превысить затраты на применение и ограничений к добавочным данным.
IGNORE_TRIGGERS
Применимо только в инструкции , если параметр используется с OPENROWSET (BULK).
Указывает, что при операции объемного импорта не будут учитываться какие-либо триггеры, определенные для таблицы. По умолчанию применяет триггеры.
Используйте только в том случае, если приложение не зависит от триггеров и максимизации производительности важно.
NOLOCK
Эквивалент . Дополнительные сведения см. в READUNCOMMITTED далее в этой статье.
Note
Для инструкций UPDATE или DELETE: эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
NOWAIT
Указывает ядро СУБД возвращать сообщение сразу после того, как в таблице обнаружена блокировка. эквивалентен указанию для определенной таблицы. Указание не работает, когда также включена подсказка . Чтобы завершить запрос, не ожидая при использовании указания, предусловите запрос вместо этого.
PAGLOCK
Применяет блокировку страниц вместо стандартной блокировки строк или ключей, а также вместо блокировки отдельной таблицы. По умолчанию используется режим блокировки, соответствующий операции. При указании в транзакциях, работающих на уровне изоляции, блокировки страниц не принимаются, если только не объединяются с другими указаниями таблицы, для которых требуются блокировки, такие как и .
READCOMMITTED
Указывает, что операции чтения соответствуют правилам уровня изоляции с помощью блокировки или управления версиями строк. Если параметр базы данных READ_COMMITTED_SNAPSHOT имеет значение OFF, ядро СУБД получает общие блокировки при чтении и освобождает эти блокировки при завершении операции чтения. Если параметр базы данных READ_COMMITTED_SNAPSHOT имеет значение ON, ядро СУБД не получает блокировки и использует управление версиями строк. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL.
Note
Для инструкций UPDATE или DELETE: эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
READCOMMITTEDLOCK
Указывает, что операции чтения соответствуют правилам уровня изоляции с помощью блокировки. ядро СУБД получает общие блокировки при чтении данных и освобождает эти блокировки при завершении операции чтения независимо от параметра базы данных READ_COMMITTED_SNAPSHOT. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL. Это указание нельзя указать в целевой таблице инструкции ; Возвращается ошибка 4140.
READPAST
Указывает, что ядро СУБД не считывать строки, заблокированные другими транзакциями. При указании блокировки на уровне строк пропускаются, но блокировки на уровне страницы не пропускаются. То есть ядро СУБД пропускает строки вместо блокировки текущей транзакции. Например, предположим, что в таблице есть один целочисленный столбец со значениями 1, 2, 3, 4, 5. Если транзакция A изменяет значение 3 на 8, но еще не зафиксировано, возвращает значения 1, 2, 4, 5.
READPAST в основном используется для уменьшения конфликтов блокировки при реализации рабочей очереди, используюющей таблицу SQL Server. Средство чтения очередей, использующее пропускать записи очереди, заблокированные другими транзакциями, в следующую доступную запись очереди, не ожидая, пока другие транзакции не будут освобождены их блокировки.
можно указать для любой таблицы, указанной в инструкции или , и любую таблицу, указанную в предложении . При указании в инструкции применяется только при чтении данных, чтобы определить, какие записи необходимо обновить, независимо от того, где он указан в инструкции. нельзя указать для таблиц в предложении оператора . Операции обновления или удаления, использующие , могут блокироваться при чтении внешних ключей или индексированных представлений или при изменении вторичных индексов.
можно указать только в транзакциях, работающих на уровнях изоляции или .
Указание таблицы невозможно указать, если для параметра базы данных задано значение , и одно из следующих условий имеет значение true:
- Уровень изоляции транзакций сеанса .
- Указание таблицы также указывается в запросе.
Чтобы указать указание в этих случаях, удалите указание таблицы, если оно присутствует, и добавьте в запрос указание таблицы.
READUNCOMMITTED
Указывает, что чтение недействительных результатов разрешено. Общие блокировки не выдаются, чтобы другие транзакции не изменяли данные, считываемые текущей транзакцией, и монопольные блокировки, заданные другими транзакциями, не блокируют чтение заблокированных данных текущей транзакции. Разрешение чтения измененных результатов может привести к повышению параллелизма за счет считывания изменений данных, откат которых произведен другими транзакциями. Это может привести к ошибкам для вашей транзакции, представить пользователей с данными, которые никогда не были зафиксированы, или привести к тому, что пользователи могут просматривать записи дважды (или вообще не регистрировать).
и подсказки применяются только к блокировкам данных. Все запросы, включая запросы с указанием и , получают блокировки Sch-S (стабильность схемы) во время компиляции и выполнения. Поэтому запросы блокируются, если параллельная транзакция удерживает в таблице блокировку Sch-M (изменение схемы). Например, операция языка DDL получает блокировку Sch-M до того, как она изменяет данные схемы. Все одновременные запросы, включая запросы, выполняемые с или указаниями, блокируются при попытке получить блокировку Sch-S. И наоборот, запрос, удерживающий блокировку Sch-S, блокирует параллельную транзакцию, которая пытается получить блокировку Sch-M.
и не может быть указан для таблиц, измененных операциями вставки, обновления или удаления. Оптимизатор запросов SQL Server игнорирует указания READUNCOMMITTED и NOLOCK в предложении FROM, которые применяются к целевой таблице инструкции UPDATE или DELETE.
Note
Поддержка использования подсказок READUNCOMMITTED и NOLOCK в предложении FROM, применяемой к целевой таблице UPDATE или инструкции DELETE/> будет удалена в будущей версии SQL Server. Следует избегать использования этих указаний в таком контексте в новой разработке и запланировать изменение приложений, использующих их в настоящий момент.
Вы можете свести к минимуму блокировку конфликтов при защите транзакций от грязных считывания незафиксированных изменений данных с помощью одного из следующих вариантов:
- Уровень изоляции с параметром базы данных .
- Уровень изоляции.
Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL.
Note
Если вы получаете сообщение об ошибке 601 при указании , устраните его так, как возникла ошибка взаимоблокировки (сообщение об ошибке 1205) и повторите инструкцию.
REPEATABLEREAD
Указывает, что сканирование выполняется с той же семантикой блокировки, что и транзакция, выполняемая на уровне изоляции . Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL.
ROWLOCK
Указывает, что вместо блокировки страниц или таблиц применяются блокировки строк. При указании в транзакциях, работающих на уровне изоляции, блокировки строк не принимаются, если они не объединяются с другими указаниями таблицы, требующими блокировки, например и . нельзя использовать с таблицей с кластеризованным индексом columnstore. В следующем примере в приложении возвращается ошибка 651.
UPDATE [dbo].[FactResellerSalesXL_CCI] WITH (ROWLOCK)
SET UnitPrice = 50
WHERE ProductKey = 150;
SERIALIZABLE
Эквивалент . Накладывает дополнительные ограничения на совмещаемую блокировку: удерживает ее до завершения транзакции вместо снятия блокировки сразу после того, как таблица или страница данных больше не требуется, независимо от того, завершена ли транзакция. Сканирование выполняется с той же семантикой, что и транзакция, выполняемая на уровне изоляции. Дополнительные сведения об уровнях изоляции см. в разделе SET TRANSACTION ISOLATION LEVEL.
SNAPSHOT
Применимо к: SQL Server 2014 (12.x) и более поздних версий
Доступ к оптимизированной для памяти таблице осуществляется в изоляции. можно использовать только с оптимизированными для памяти таблицами (не с таблицами на основе дисков), как показано в следующем примере. Дополнительные сведения см. в разделе Введение в таблицы, оптимизированные для памяти.
SELECT *
FROM dbo.Customers AS c WITH (SNAPSHOT)
LEFT OUTER JOIN dbo.[Order History] AS oh
ON c.customer_id = oh.customer_id;
SPATIAL_WINDOW_MAX_CELLS = integer_value
Применимо к: SQL Server 2012 (11.x) и более поздних версий
Указывает максимальное количество ячеек, используемых для тесселяции геометрического или географического объекта. integer_value может содержать любое число в диапазоне от 1 до 8192.
Этот параметр позволяет выполнять тонкую настройку времени выполнения запроса за счет настройки компромисса между временем выполнения первичного и вторичного фильтра. Чем больше число, тем меньше время выполнения вторичного фильтра и больше время выполнения первичного фильтра, и наоборот. Для получения более плотных пространственных данных большее число должно давать большее время выполнения за счет лучшего приближения с первичным фильтром и сокращения времени выполнения вторичного фильтра. Для более разреженных данных меньшее число уменьшает время выполнения первичного фильтра.
Этот параметр работает и в ручной и в автоматической тесселяции сетки.
TABLOCK
Указывает, что полученная блокировка применяется на уровне таблицы. Тип полученной блокировки зависит от того, какая инструкция выполняется. Например, оператор может получить общую блокировку. Указав, общая блокировка применяется ко всей таблице, а не на уровне строки или страницы. Если также задано, блокировка таблицы будет храниться до конца транзакции.
При импорте данных в кучу с помощью инструкции можно включить минимальное ведение журнала и оптимальную блокировку для инструкции, указав указание целевой таблицы. Кроме того, для базы данных должна быть задана простая модель восстановления или модель восстановления с неполным протоколированием. Указание также позволяет параллельным вставкам в кучу или кластеризованные индексы columnstore. Дополнительные сведения см. в разделе INSERT.
При использовании с поставщиком массового набора строк OPENROWSET для импорта данных в таблицу позволяет нескольким клиентам одновременно загружать данные в целевую таблицу с оптимизированным ведением журнала и блокировкой. Дополнительные сведения см. в разделе Предварительные требования для минимального ведения журнала вмассового импорта.
TABLOCKX
Указывает, что к таблице применяется монопольная блокировка.
UPDLOCK
Указывает, что блокировки обновления применяются и удерживаются до завершения транзакции. принимает блокировки обновления для операций чтения только на уровне строки или на уровне страницы. Если используется сочетание или блокировка уровня таблицы принимается по какой-либо другой причине, вместо этого берется монопольная блокировка (X).
При указании подсказки уровня изоляции игнорируются. Например, если задан уровень изоляции сеанса и указан запрос (, ), указание игнорируется, а транзакция выполняется с помощью уровня изоляции.
XLOCK
Указывает, что монопольные блокировки применяются и удерживаются до завершения транзакции. Если задано с , или монопольные блокировки применяются к соответствующему уровню детализации.
Remarks
Подсказки таблицы игнорируются, если таблица не обращается к плану запроса. Это может быть вызвано тем, что оптимизатор не обращается к таблице вообще или, так как индексированное представление обращается вместо этого. В последнем случае доступ к индексированного представления можно предотвратить с помощью указания запроса .
Все подсказки блокировки распространяются на все таблицы и представления, к которым имеет доступ данный план запроса, в том числе в таблицы и представления, на которые ссылается данное представление. Кроме того, SQL Server выполняет соответствующие проверки согласованности блокировки.
Подсказки блокировки , и , которые получают блокировки на уровне строк, могут размещать блокировки на ключах индекса, а не на фактических строках данных. Например, если в таблице есть некластеризованный индекс, а оператор с помощью указания блокировки обрабатывается индексом покрытия, блокировка приобретается на ключе индекса в индексе покрытия, а не в строке данных в базовой таблице.
Если таблица содержит вычисляемые столбцы, вычисляемые выражениями или функциями, обращаюющимися к столбцам в других таблицах, подсказки таблицы не используются в этих таблицах и не распространяются. Например, указание таблицы указывается в таблице в запросе. В этой таблице есть столбцы, вычисляемые с помощью сочетания выражений и функций, получающих доступ к столбцам другой таблицы. Таблицы, на которые ссылаются выражения и функции, не используют подсказку таблицы при доступе.
SQL Server не допускает несколько подсказок таблицы из каждой из следующих групп для каждой таблицы в предложении FROM:
- Детализированные указания: , , , , или .
- Указания уровня изоляции: , , , .
Подсказки отфильтрованного индекса
Отфильтрованный индекс можно использовать в качестве указания таблицы, но заставляет оптимизатор запросов создавать ошибку 8622, если она не охватывает все строки, которые выбирает запрос. Далее приводится пример недопустимого указания отфильтрованного индекса. В примере создается отфильтрованный индекс , а затем он используется в качестве указания индекса для инструкции . Предикат отфильтрованного индекса содержит строки данных для ComponentID со значениями 533, 324 и 753. Предикат запроса также содержит строки данных для componentIDs 533, 324 и 753, но расширяет результирующий набор, чтобы включить компоненты 855 и 924, которые не входят в фильтрованный индекс. Поэтому оптимизатор запросов не может использовать отфильтрованный индекс и создает ошибку 8622. Дополнительные сведения см. в статье Создание отфильтрованных индексов.
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
Оптимизатор запросов не учитывает указание индекса, если параметры не имеют необходимых значений для отфильтрованных индексов. Дополнительные сведения см. в разделе CREATE INDEX.
Используйте NOEXPAND
применяется только к индексированных представлениям. Индексированное представление — это представление с созданным на нем уникальным кластеризованным индексом. Если запрос содержит ссылки на столбцы, присутствующие как в индексированном представлении, так и в базовых таблицах, а оптимизатор запросов определяет, что использование индексированного представления является лучшим методом выполнения запроса, оптимизатор будет использовать индекс представления. Эта функциональная возможность называется сопоставлением индексированного представления. Автоматическое использование индексированного представления оптимизатором запросов поддерживается только в определенных выпусках SQL Server. База данных SQL Azure и Управляемый экземпляр SQL Azure также поддерживают автоматическое использование индексированных представлений без указания указания NOEXPAND.
Дополнительные сведения см . в руководстве по архитектуре обработки запросов.
Список функций, поддерживаемых выпусками SQL Server на #REF!, см. в следующих статье:
- Editions и поддерживаемые функции SQL Server 2025
- Editions и поддерживаемые функции SQL Server 2022
- Editions и поддерживаемые функции SQL Server 2019
- Editions и поддерживаемые функции SQL Server 2017
- Editions и поддерживаемые функции SQL Server 2016
Однако для оптимизатора запросов следует учитывать индексированные представления для сопоставления или использовать индексированное представление, на которое ссылается указание , следующие параметры должны иметь значение .
- ANSI_NULLS
- ANSI_PADDING
- ANSI_WARNINGS
- ARITHABORT 1
- CONCAT_NULL_YIELDS_NULL
- QUOTED_IDENTIFIER
1 неявно устанавливается , если задано значение . Поэтому вам не нужно вручную настраивать этот параметр.
Кроме того, параметр должен иметь значение .
Чтобы принудительно оптимизатор запросов использовал индекс для индексированного представления, укажите этот параметр. Это указание можно использовать только в случае, если представление также названо в запросе. SQL Server не предоставляет указания на принудительное использование определенного индексированного представления в запросе, который не называет представление непосредственно в предложении FROM. Однако оптимизатор запросов рассматривает использование индексированных представлений, даже если они не ссылаются непосредственно в запросе. #REF! автоматически создает статистику для индексированного представления при использовании указания таблицы NOEXPAND. Опущение этого указания может привести к предупреждениям плана выполнения о отсутствии статистики, которая не может быть разрешена путем создания статистики вручную.
Во время оптимизации запросов ядро СУБД использует статистику просмотра, созданную автоматически или вручную, когда запрос ссылается непосредственно на представление и используется подсказка NOEXPAND.
Использование табличного указания в качестве указания запроса
указания таблицы также можно указать в качестве указания запроса с помощью предложения . Табличные указания рекомендуется использовать в качестве подсказок в запросах только в контексте структуры плана. Для нерегламентированных запросов укажите эти подсказки только в виде табличных подсказок. Дополнительные сведения см. в указаниях запросов.
Permissions
Указания , и требуют разрешений в таблице.
Examples
A. Указание TABLOCK позволяет указать метод блокировки
В следующем примере указано, что общий блокировка принимается на таблице в базе данных AdventureWorks2025 и сохраняется до конца оператора.
UPDATE Production.Product WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
B. Используйте указание FORCESEEK, чтобы указать операцию поиска индекса
Следующий пример использует подсказку без указания индекса, чтобы заставить оптимизатора запроса выполнить операцию поиска индекса в таблице в базе данных AdventureWorks2025.
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
В следующем примере используется указание с индексом, чтобы заставить оптимизатор запросов выполнять операцию поиска индекса по указанному индексу и столбцу индекса.
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 для указания операции сканирования индекса
В следующем примере подсказка используется для принудительного оптимизатора запроса выполнить операцию сканирования таблицы в базе данных AdventureWorks2025.
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);