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

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

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

  1. текущий оператор SELECT
  2. другие транзакции против данной таблицы

Пример:

Select * 
from aTable with (NOLOCK)

5 ответов

Решение

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

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

С чего бы это?

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

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

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

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

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

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

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

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

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

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

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

См. http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

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

  • Текущий SELECT начнется раньше, потому что не нужно ждать.

  • Другие транзакции будут замедляться, поскольку теперь они делят время обработки с новой транзакцией.

Не используйте это.

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

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

Набор ошибок или результатов может быть пустым, содержать пропущенные строки или отображать одну и ту же строку несколько раз.

Это связано с тем, что другие транзакции перемещают данные одновременно с чтением.

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

Есть и другие побочные эффекты, которые приносят в жертву увеличение скорости, которое вы надеялись получить в первую очередь.

Теперь вы знаете, никогда не используйте его снова.

Другие вопросы по тегам