Использование подсказки таблицы WITH NOLOCK в запросе с использованием представления - распространяется ли оно внутри представления? - PullRequest
56 голосов
/ 22 ноября 2008

Если подсказка запроса «WITH NOLOCK» используется в представлении в SQL Server, распространяет ли он эту подсказку на само определение представления, даже если NOLOCK НЕ используется для необработанных таблиц в определении представления? Причина, по которой это необходимо, заключается в том, что иногда персонал службы поддержки хочет выполнять огромные трудоемкие запросы, но не будет принудительно устанавливать эту блокировку для всех запросов, используя представление в самом приложении.

Ответы [ 2 ]

67 голосов
/ 22 ноября 2008

Да, NOLOCK будет распространяться на таблицы, используемые определением представления (по крайней мере, в SQL Server 2005).

См. Таблица подсказок в MSDN:

В SQL Server 2005 все подсказки блокировки распространяются на все таблицы и представления, на которые имеются ссылки в представлении. Кроме того, SQL Server выполняет соответствующие проверки согласованности блокировок.

Однако

Если таблица содержит вычисляемые столбцы и вычисленные столбцы вычисляются выражениями или функциями, обращающимися к столбцам в других таблицах, подсказки таблиц не используются в этих таблицах. Это означает, что табличные подсказки не распространяются. Например, табличная подсказка NOLOCK указана для таблицы в запросе. В этой таблице есть вычисляемые столбцы, которые вычисляются с помощью комбинации выражений и функций, которые обращаются к столбцам в другой таблице. Таблицы, на которые ссылаются выражения и функции, не используют табличную подсказку NOLOCK при обращении.

Если вы используете индексированные представления, вам, возможно, захочется прочитать немного больше, поскольку там также есть некоторые особые случаи.

Также см. Разрешение просмотра для получения дополнительной информации.

12 голосов
/ 03 февраля 2009

Просто в дополнение к отличному ответу Рори.

Он пишет: «Да, NOLOCK распространится на таблицы, используемые определением представления (по крайней мере, в SQL Server 2005)

На самом деле это будет работать и в SQL 2000. От BOL:

Поскольку select_statement использует оператор SELECT, он допустим для использования и подсказок, как указано в предложении FROM. Для получения дополнительной информации см. ОТ и ВЫБРАТЬ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...