SQL 2005: подсказка NOLOCK значительно увеличивает чтение. WTF?
У меня есть хранимая процедура, которая делает намного больше операций чтения, когда подсказка NOLOCK добавляется в запрос. Я сбит с толку - кто-нибудь знает почему, пожалуйста?
Подробности: запрос:
SELECT * FROM dbo.<table-name> WITH (NOLOCK).
Было выполнено 40000 операций чтения, и в нем менее 2000 строк. Я установил, что большинство этих операций чтения вызваны 3 столбцами TEXT. (Если я пропущу их, число операций чтения снизится до 59!). Но когда я удаляю WITH (NOLOCK), оно увеличивается с 40000 операций чтения до 13000. Я повторил это несколько раз, потому что подумал, что, должно быть, облажался, но это действительно последовательно в обоих направлениях.
2 ответа
NOLOCK читает данные из транзакций, которые не были зафиксированы.
РЕДАКТИРОВАТЬ
Демонстрация чтения NOLOCK незафиксированных данных.
create table table1 (id int, val int)
go
select * from table1 with ( NoLock)
begin tran
insert into table1 values (1,1)
--Switch to new query window
select * from table1 with ( NoLock)
--switch back
rollback tran
select * from table1 with ( NoLock)
Может быть, счетчик считываний включает в себя чтение страниц для чтения блокировок?