Получаю, что подсказка оптимизатора (nolock)
позволяет «грязные чтения», но по каким очень конкретным сценариям это плохая идея? Я никогда не видел такого широкого использования (nolock)
в организации, и это заставляет меня нервничать. Мне хотелось бы объяснить объяснения пользователей. «Павел делает A, Питер делает B, X происходит вместо Y».Что может произойти в результате использования (nolock) для каждого SELECT в SQL Server?
ответ
перепроведение this ответа:
NOLOCK
означает не став замков на всех.
Ваш может запрос возвращает порцию данных, как раньше UPDATE
и порций по состоянию после UPDATE
в одном запросе.
Как дебет без кредита и таких вещей.
Например, я побежал этот запрос на большом столе:
SELECT SUM(LEN(name))
FROM master WITH (NOLOCK)
OPTION (MAXDOP 1)
---
18874367
Все name
«s имеют длину 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
И этот запрос запускается сразу после завершения предыдущего, видит все обновления.
Недавно я потратил много времени на то, чтобы выяснить время и проблемы блокировки для процесса сборки хранилища данных. Как оказалось, из-за только для чтения данных для загрузки хранилища я добавил подсказки nolock к запросам исходных данных для etl, чтобы уменьшить потребность в эскалации блокировки на сервере sql и сохранить потерю etl от отказа , Для этого я очень мало контролировал сервер sql и приложение. Опять же, это было целевое решение, и я не рекомендую широко использовать любые подсказки в качестве общего правила. Как и все тесты производительности и обзор, есть ключевые области, на которые нужно обратить внимание, чтобы определить, где лежит проблема, и что может быть лучшим способом атаковать ее.
Если источник данных был доступен только для чтения, почему это важно, если разделяемая блокировка чтения был помещен на него? Может, я неправильно понял, что вы написали? –
Это не ответ на мой вопрос, это пропаганда для NOLOCK как стратегии. Напротив того, что я ищу. -1. –
См. Эту ссылку для примера.
http://blogs.msdn.com/davidlean/archive/2009/04/06/sql-server-nolock-hint-other-poor-ideas.aspx
- 1. Серверный NOLOCK в SQL Server
- 2. Что такое использование NOLOCK в инструкции SELECT?
- 3. SQL Server NOLOCK и присоединяется
- 4. SQL SELECT ... В результате того,
- 5. ServiceStack.OrmLite подсказка nolock в SQL Server
- 6. синтаксис NOLOCK в SQL
- 7. Использование nolock в sql
- 8. Является ли NOLOCK по умолчанию для операторов SELECT в SQL Server 2005?
- 9. SQL Server Inner Join Using С (NOLOCK)
- 10. SQL Server NOLOCK с JOIN, массовая загрузка
- 11. Что плохого может произойти при снижении индексов?
- 12. Значение функции процедуры SQL Server для использования в предложении select
- 13. SQL Server 2008: как работает NOLOCK для CTE?
- 14. С помощью (nolock) в каждом SELECT-NHibernate
- 15. Ошибка SQL Server Service Broker -9616, когда это может произойти?
- 16. SQL Server для каждого цикла
- 17. SQL Server - SELECT TOP 5 строк для каждого FK
- 18. Объединить столбцы в результате из SQL SELECT
- 19. Ошибка от NOLOCK на CTE в SQL Server 2008 SP2
- 20. SQL Server NOLOCK для запросов запускается для авторизации
- 21. Снимок SQL Server 2008 или подсказка NOLOCK для чтения задач?
- 22. SQL Server SELECT, в РЕГИСТРИРУЙТЕСЬ
- 23. SQL Server: Выберите в Select
- 24. с (nolock), (nolock), nolock отличия?
- 25. Использование Для каждого В SQL Server
- 26. SQL Server: WHILE В SELECT?
- 27. Блокировка таблицы SQL Server в длинном запросе - решение: NoLock?
- 28. Рекурсия в операторе Select для SQL Server
- 29. Грант ReadOnly с разрешением (nolock) в SQL Server
- 30. SQL Server SELECT first
Не переписывает ли ответ на вопрос как дубликат? – AnthonyWJones
Нет. '42' - хороший ответ для многих вопросов :) – Quassnoi
Вы также можете упомянуть, что такое поведение не уникально для' READ UNCOMMITTED' - это может произойти и при 'READ COMMITTED' и' REPEATABLE READ'. Это гораздо более вероятно на самом низком уровне изоляции. –