SQL: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

是否有任何原因会导致向查询添加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 = 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。:)虽然我想你可以称之为“不完整”的统计数据,而不是你所说的“不准确”的统计数据,这仍然是“不好的”。我们可以整天推测:)重点是,更好的衡量方法和等待和排队方法是一个很好的资源。