Эффект подсказки NOLOCK в операторах SELECT

Я думаю, что реальный вопрос:

Если я не забочусь о грязных чтениях, добавление подсказки с (NOLOCK) к оператору SELECT влияет на производительность:

  • текущая инструкция SELECT
  • другие транзакции по данной таблице

Пример:

Select * 
from aTable with (NOLOCK)

Ответ 1

1) Да, выбор с NOLOCK завершится быстрее обычного выбора.

2) Да, выбор с помощью NOLOCK позволит другим запросам выполнить выполненную таблицу быстрее, чем обычный выбор.

Почему это должно быть?

NOLOCK обычно (в зависимости от вашего механизма БД) означает предоставление мне ваших данных, и мне все равно, в каком состоянии оно находится, и не беспокойтесь, удерживая его, пока вы читаете его. Все это происходит быстрее, менее ресурсоемким и очень опасным.

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

У вас действительно нет способа узнать, что такое состояние данных.

Если вы пытаетесь получить такие вещи, как граф строк или другие сводные данные, где допустимы некоторые допустимые пределы погрешности, тогда NOLOCK - хороший способ повысить производительность этих запросов и не дать им негативно повлиять на производительность базы данных.

Всегда используйте подсказку NOLOCK с большой осторожностью и обрабатывайте любые данные, которые она вызывает подозрительно.

Ответ 2

NOLOCK делает большинство операторов SELECT быстрее из-за отсутствия общих блокировок. Кроме того, отсутствие выдачи блокировок означает, что вашим SELECT не будет препятствовать писателям.

NOLOCK функционально эквивалентен уровню изоляции READ UNCOMMITTED. Основное различие заключается в том, что вы можете использовать NOLOCK для некоторых таблиц, но не для других, если вы выберете. Если вы планируете использовать NOLOCK для всех таблиц в сложном запросе, то использование SET SETACTION ISOLATION LEVEL READ UNCOMMITTED проще, потому что вам не нужно применять подсказку к каждой таблице.

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

УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СТАВКИ

Подсказка таблицы (Transact-SQL)

Ответ 4

Это будет быстрее, потому что ему не нужно ждать блокировок

Ответ 5

  • Ответ Да, если запрос выполняется несколько раз за раз, потому что каждой транзакции не нужно ждать завершения других. Однако, если запрос выполняется один раз, тогда ответ - нет.

  • Да. Существует значительная вероятность того, что осторожное использование WITH (NOLOCK) ускорит вашу базу данных в целом. Это означает, что другим транзакциям не придется ждать завершения этого оператора SELECT, но, с другой стороны, другие транзакции будут замедляться, поскольку теперь они делят время обработки с новой транзакцией.

Будьте осторожны, только используйте WITH (NOLOCK) в инструкциях SELECT для таблиц с кластерным индексом.

WITH (NOLOCK) часто используется как магический способ ускорить транзакции чтения базы данных.

Результирующий набор может содержать строки, которые еще не были зафиксированы и которые впоследствии будут откатываться.

Если WITH (NOLOCK) применяется к таблице, имеющей некластеризованный индекс, то индексы строк могут быть изменены другими транзакциями, поскольку данные строк передаются в таблицу результатов. Это означает, что в наборе результатов могут отсутствовать строки или отображаться одна и та же строка несколько раз.

READ COMMITTED добавляет дополнительную проблему, когда данные повреждены в одном столбце, когда несколько пользователей одновременно изменяют одну и ту же ячейку.