SQL:NOLOCK导致查询速度减慢
是否有任何原因会导致向查询添加nolock会增加执行时间SQL:NOLOCK导致查询速度减慢,sql,tsql,sql-server-2008,Sql,Tsql,Sql Server 2008,是否有任何原因会导致向查询添加nolock会增加执行时间 UPDATE TargetTable SET col1 = c1.RowCnt, col2 = c2.RowCnt from TargetTable tt join ( select col3, RowCnt = NULLIF(COUNT(*),0) from Table2 (nolock) group by col3 ) c1 on c1.col3 = t
UPDATE TargetTable
SET col1 = c1.RowCnt,
col2 = c2.RowCnt
from TargetTable tt
join
(
select col3, RowCnt = NULLIF(COUNT(*),0) from Table2 (nolock)
group by col3
) c1 on c1.col3 = tt.ID
join
(
select col4, RowCnt = NULLIF(COUNT(*),0) from Table2 (nolock)
group by col4
) c2 on c2.col4 = tt.ID
WHERE timestamp BETWEEN @FromDate AND @ToDate
AND (tt.Client_ID = @Client_ID)
我从来没有听说过。我会看:
-更改是表中的数据更改查询的总体成本
-锁定正在更新的表的其他服务器活动
-降低CPU可用性的其他服务器活动
-使用硬盘的后台操作系统任务此表是否存在大量写入活动?您确定正确的行在这两种情况下都会受到影响吗?您是否尝试过使用设置事务隔离级别而不是在查询中放置单个提示
UPDATE tt SET
col1 = NULLIF(c1.RowCnt, 0),
col2 = NULLIF(c2.RowCnt, 0)
FROM dbo.TargetTable AS tt
INNER JOIN
(
SELECT col3, RowCnt = COUNT(*)
FROM dbo.Table2 WITH (NOLOCK)
GROUP BY col3
) AS c1 ON c1.col3 = tt.ID
INNER JOIN
(
SELECT col4, RowCnt = COUNT(*)
FROM dbo.Table2 WITH (NOLOCK)
GROUP BY col4
) AS c2 ON c2.col4 = tt.ID
WHERE tt.[timestamp] BETWEEN @FromDate AND @ToDate
AND tt.Client_ID = @Client_ID;
-- with SQL Server's UPDATE FROM syntax, you should reference the alias in the UPDATE
-- use WITH (NOLOCK), as your current syntax could become an alias in later versions
-- get in the habit of using dbo. prefix and statement terminators
-- are you sure you don't want left joins?
NOLOCK提示允许。因此,他们可能会创建一个完全不同的执行计划,一个预期更快但结果却较慢的执行计划(例如,由于过时的统计数据而导致错误的基数估计)。与任何性能问题一样,使用调查方法找出问题的原因。这是一种非常好的方法。您能告诉我们时差和返回的行数吗?请问查询计划是什么样的?如果您将此更改为SELECT以测试此位,会不会有更新到不准确数据的风险?@HLGEM是和否。在运行此查询时,数据不应该被任何人修改/使用,但这让我想到了他为什么要在其中添加nolock。他说该查询正在锁定阻止其他查询的行。也许它将锁升级到了表级…@JNK:可能。将实际计划中的估计行数与实际行数进行比较,将立即判断统计数据是否错误。除非是索引选择性问题……如果最近在具有完全重建统计数据的聚集索引上出现该问题,b/c 500多行的值仅为90k。:)虽然我想你可以称之为“不完整”的统计数据,而不是你所说的“不准确”的统计数据,这仍然是“不好的”。我们可以整天推测:)重点是,更好的衡量方法和等待和排队方法是一个很好的资源。