Sql server 2005 SQL2005:NOLOCK提示显著增加读取。世界跆拳道联盟?
我有一个存储过程,当NOLOCK提示添加到查询中时,它会执行更多的读取。我很困惑,有人知道为什么吗 详情: 查询是:Sql server 2005 SQL2005:NOLOCK提示显著增加读取。世界跆拳道联盟?,sql-server-2005,locking,query-hints,Sql Server 2005,Locking,Query Hints,我有一个存储过程,当NOLOCK提示添加到查询中时,它会执行更多的读取。我很困惑,有人知道为什么吗 详情: 查询是: SELECT * FROM dbo.<table-name> WITH (NOLOCK). 从dbo中选择*。与(诺洛克)。 它进行了40000次读取,只有不到2000行。我确定大多数读取是由3个文本列引起的。(如果我忽略这些,它将下降到59次读取!)但当我删除WITH(NOLOCK)时,它将从40000次读取增加到13000次。我重复了几次,因为我认为我一定是搞
SELECT * FROM dbo.<table-name> WITH (NOLOCK).
从dbo中选择*。与(诺洛克)。
它进行了40000次读取,只有不到2000行。我确定大多数读取是由3个文本列引起的。(如果我忽略这些,它将下降到59次读取!)但当我删除WITH(NOLOCK)时,它将从40000次读取增加到13000次。我重复了几次,因为我认为我一定是搞砸了,但这两种方法都是一致的。也许读取计数包括读取锁的页面读取 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)
我不同意你,查尔斯。(NOLOCK)不是只忽略锁吗?@David,我承认我在猜这个,但是因为它忽略了这些锁,这不意味着它不必读取磁盘来找出哪些锁可能会影响查询。。。否?执行计划是相同的吗?@David Wimbush:你能发布这两个XML查询计划吗?为什么你只想从事务日志中读取数据?什么情况下,您不需要查看实际数据库中的数据,但希望查看未提交的数据?我不明白。如果不运行多个注释,最好将其视为读取数据库和事务日志中的可用内容。如果您正在读取的行/表中没有未提交的事务,您将看到正常情况下会看到的内容,但是如果有人启动了一个trans,插入了数据,然后回滚了insert,那么您可能会读取后来回滚的数据。为什么?有时,性能与粒度精度是一个合理的权衡。或者,缺乏对影响的认识;)