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



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



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




  1. текущий оператор SELECT

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


пример:



Select * 
from aTable with (NOLOCK)
572   5  

5 ответов:

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

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

С чего бы это?

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

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

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

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

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

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

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

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

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

табличная подсказка (Transact-SQL)

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.