Вопрос

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

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

Например; является:

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 Что всегда лучше, чем давать индивидуальные подсказки. Или, лучше еще, если вы заботитесь о деталях, как последовательность, использовать Изоляция снимка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top