SQL Server Nolock и объединяет
-
04-10-2019 - |
Вопрос
Фон: у меня есть критический запрос на производительность, я хотел бы бежать, и мне не волнует грязные читания.
Мой вопрос; Если я использую присоединения, мне нужно указать нолоцкий намек на них?
Например; является:
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)
Подсказка на присоединение, чтобы убедиться, что я не запираю присоединенный стол?
Решение
Я не буду решать READ UNCOMMITTED
аргумент, просто ваш оригинальный вопрос.
Да, вам нужно WITH(NOLOCK)
на каждой таблице присоединения. Нет, ваши запросы не одинаковы.
Попробуйте это упражнение. Начните транзакцию и вставьте строку в Table1 и Table2. Не совершайте и не откатывайте транзакцию еще. На данный момент ваш первый запрос вернется успешно и включает в себя незарегистрированные строки; Ваш второй запрос не будет возвращаться, потому что Table2 не имеет WITH(NOLOCK)
намек на это.
Другие советы
Я был уверен, что вам нужно указать 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)
Запрос подсказки.
Ни один. Вы устанавливаете уровень изоляции в READ UNCOMMITTED
Что всегда лучше, чем давать индивидуальные подсказки. Или, лучше еще, если вы заботитесь о деталях, как последовательность, использовать Изоляция снимка.