Я предполагаю, что реальный вопрос:
Если меня не волнует грязное чтение, добавление подсказки with (NOLOCK) к оператору SELECT повлияет на производительность:
- текущий оператор SELECT
- другие транзакции против данной таблицы
Пример:
Select *
from aTable with (NOLOCK)
sql
sql-server
locking
Боб Пробст
источник
источник
Ответы:
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
источник
Это будет быстрее, потому что не нужно ждать блокировки
источник
Ответ « Да», если запрос выполняется несколько раз за раз, потому что каждой транзакции не нужно ждать завершения других. Однако, если запрос выполняется один раз, тогда ответ - Нет.
Да . Существует значительная вероятность того, что осторожное использование WITH (NOLOCK) ускорит вашу базу данных в целом. Это означает, что другим транзакциям не придется ждать завершения этого оператора SELECT, но, с другой стороны, другие транзакции будут замедляться, поскольку теперь они делят время обработки с новой транзакцией.
Будьте осторожны, чтобы использовать только
WITH (NOLOCK)
в инструкциях SELECT для таблиц с кластеризованным индексом.WITH (NOLOCK) часто используется как магический способ ускорить транзакции чтения базы данных.
Результирующий набор может содержать строки, которые еще не были зафиксированы и которые впоследствии часто откатываются.
Если WITH (NOLOCK) применяется к таблице, имеющей некластеризованный индекс, то индексы строк могут быть изменены другими транзакциями, поскольку данные строк передаются в таблицу результатов. Это означает, что в наборе результатов могут отсутствовать строки или отображаться одна и та же строка несколько раз.
READ COMMITTED добавляет дополнительную проблему, когда данные повреждены в одном столбце, когда несколько пользователей одновременно изменяют одну и ту же ячейку.
источник