SQL Server NOLOCK и присоединяется - PullRequest
       11

SQL Server NOLOCK и присоединяется

137 голосов
/ 24 сентября 2010

Справочная информация: у меня есть запрос, критичный к производительности, который я хотел бы выполнить, и меня не волнует грязное чтение.

Мой вопрос; Если я использую объединения, нужно ли на них указывать подсказку NOLOCK?

Например; это:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

Эквивалентно:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

Или мне нужно будет указать подсказку (NOLOCK) в соединении, чтобы убедиться, что я не блокирую объединенную таблицу?

Ответы [ 3 ]

145 голосов
/ 24 сентября 2010

Я не буду обращаться к аргументу READ UNCOMMITTED, только ваш первоначальный вопрос.

Да, вам нужно WITH(NOLOCK) в каждой таблице объединения.Нет, ваши запросы не совпадают.

Попробуйте это упражнение.Начните транзакцию и вставьте строку в table1 и table2.Не совершайте и не отменяйте транзакцию.На этом этапе ваш первый запрос будет успешно возвращен и будет включать в себя незафиксированные строки;Ваш второй запрос не вернется, потому что в table2 нет подсказки WITH(NOLOCK).

16 голосов
/ 24 сентября 2010

Я был почти уверен, что вам нужно указать NOLOCK для каждого JOIN в запросе.Но мой опыт был ограничен SQL Server 2005.

Когда я посмотрел MSDN только для подтверждения, я не смог найти ничего определенного.Представленные ниже утверждения, похоже, заставляют меня думать, что в 2008 году два ваших утверждения выше эквивалентны, хотя в 2005 году это не так:

[SQL Server 2008 R2]

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

[SQL Server 2005]

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

Кроме того, обратите внимание - и это относится как к 2005, так и к 2008 году:

Подсказки таблицы игнорируются, если к плану запроса нет доступа к таблице.Это может быть вызвано тем, что оптимизатор решил вообще не обращаться к таблице, или потому что вместо этого осуществляется доступ к индексированному представлению.В последнем случае доступ к индексированному представлению можно предотвратить с помощью подсказки OPTION (EXPAND VIEWS).

9 голосов
/ 24 сентября 2010

Ни. Вы устанавливаете уровень изоляции на READ UNCOMMITTED, что всегда лучше, чем давать индивидуальные подсказки блокировки. Или, что еще лучше, если вам нужны такие детали, как согласованность , используйте изоляция моментальных снимков .

...