2009-07-08 7 views
2

отчет в моем приложении запускает запрос, который требует от 5 до 15 секунд (ограничен количеством строк, которые будут возвращены). Запрос состоит из 8 подключений почти ко всем основным таблицам моего приложения (клиенты, продажи, юниты и т. Д.).Блокировка таблицы SQL Server в длинном запросе - решение: NoLock?

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

Решение от друга состоит в том, чтобы иметь каждое соединение в запросе, которое не является обязательным для получения 100% правильных данных (грязное чтение) с помощью NoLock, поэтому только одна из этих 8 таблиц будет заблокирована полностью. Это хорошее решение? Для отчета, в котором 99% данных поступают из одной таблицы, разблокируйте менее таблицы prio?

ответ

4

Попробуйте взглянуть на ЧИТАЕМОЕ СООБЩЕНИЕ, а не NOLOCK. Это означает, что данные могут быть «старыми», но никогда не будут грязными.

4

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 

И этот запрос запускается сразу после завершения предыдущего, видит все обновления.

+0

Понимаете, я прав? Вы имеете в виду, что в течение 15 секунд, когда выполняется запрос выбора, будет быстрое обновление, например. customeraddress, то половина будет иметь первый адрес, а вторую половину нового? – Kovu

+0

@ Kovu: справа, см. Обновление сообщения. – Quassnoi

0

Это нормально, до тех пор, как вы размещаете очень сильный акцент на этой фразе:

, который не mandetory иметь 100% правильных данных (Dirty Read)

Таким образом, вы, вероятно, дон Не хотите добавить подсказку nolock в таблицу продаж, но таблица ваших клиентов (которая, скорее всего, увидит меньше изменений), может быть в порядке. Даже там, вероятно, вы не используете столько записей клиентов в одном запросе, но если кто-то изменит это, это может быть большой проблемой. Поэтому вы можете указать подсказку rowlock для этой таблицы.

Смежные вопросы