Что может произойти в результате использования (nolock) на каждом SELECT в SQL Server?
Я понимаю, что (nolock)
Подсказка оптимизатора допускает "грязное чтение", но при каких очень специфических сценариях это плохая идея? Я никогда не видел такого широкого использования (nolock)
в организации, и это заставляет меня нервничать. Я хотел бы объяснить с точки зрения пользовательских историй. "Павел делает A, Питер делает B, X происходит вместо Y".
3 ответа
Перепостим этот ответ:
NOLOCK
значит не ставить замки вообще.
Ваш запрос может вернуть части данных, как и раньше UPDATE
и порции после UPDATE
в одном запросе.
Мол, дебет без кредита и тому подобное.
Например, я только что выполнил этот запрос на большой таблице:
SELECT SUM(LEN(name))
FROM master WITH (NOLOCK)
OPTION (MAXDOP 1)
---
18874367
Все name
длина 1
,
Затем я перезапускаю его и в середине запроса обновляю таблицу:
UPDATE master
SET name = 'tt'
WHERE id <= 10000
SELECT SUM(LEN(name))
FROM master WITH (NOLOCK)
OPTION (MAXDOP 1)
---
18874944
Как мы видим, этот запрос заметил 577
строки как обновленные (длина 2
), все остальные строки не обновлены (длина 1
).
SELECT SUM(LEN(name))
FROM master WITH (NOLOCK)
OPTION (MAXDOP 1)
---
18884367
И этот запрос, запускаемый сразу после завершения предыдущего, видит все обновления.
Смотрите эту ссылку для примеров.
http://blogs.msdn.com/davidlean/archive/2009/04/06/sql-server-nolock-hint-other-poor-ideas.aspx
Недавно я потратил много времени на то, чтобы выяснить и заблокировать проблемы для процесса построения хранилища данных. Оказывается, из-за того, что данные для загрузки хранилища доступны только для чтения, я добавил подсказки nolock к запросам исходных данных для etl, чтобы уменьшить потребность в эскалации блокировки на сервере sql и не допустил сбоя загрузки etl., Для этого у меня было очень мало контроля над сервером SQL и приложением. Опять же, это было целевое решение, и я не рекомендую широко использовать какие-либо подсказки для запросов в качестве общего правила. Как и во всех тестах и обзорах производительности, есть ключевые области, на которые нужно обратить внимание, чтобы определить, в чем заключается проблема и как лучше всего ее решить.