Вопрос

Я думаю, настоящий вопрос:

Если меня не волнуют грязные чтения, я добавлю с (НОЛОК) подсказка для оператора SELECT влияет на производительность:

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

Пример:

Select * 
from aTable with (NOLOCK)
Это было полезно?

Решение

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/previcious-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

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

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

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

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

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

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

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

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

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

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

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

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