Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL2005:NOLOCK提示显著增加读取。世界跆拳道联盟?_Sql Server 2005_Locking_Query Hints - Fatal编程技术网

Sql server 2005 SQL2005: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次。我重复了几次,因为我认为我一定是搞

我有一个存储过程,当NOLOCK提示添加到查询中时,它会执行更多的读取。我很困惑,有人知道为什么吗

详情: 查询是:

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,那么您可能会读取后来回滚的数据。为什么?有时,性能与粒度精度是一个合理的权衡。或者,缺乏对影响的认识;)