【问题标题】:SQL Server Update Slow with JoinSQL Server 使用联接更新缓慢
【发布时间】:2013-03-31 00:34:52
【问题描述】:

我有一个这样的 sql 更新语句

UPDATE t1 SET t1.Field = t2.Field
FROM Table1 as t1
INNER JOIN Table2 as t2 on t1.Key = t2.Key
WHERE t2.FilterField = 'abc'

where 子句使得没有行被更新,该语句运行 30 分钟。 (该表有 5000 万行)

如果我将语句更改为有什么奇怪的

SELECT t1.Field, t2.Field
FROM Table1 as t1
INNER JOIN Table2 as t2 on t1.Key = t2.Key
WHERE t2.FilterField = 'abc'

一个空的结果集几乎立即返回

如果我将语句更改为

UPDATE t1 SET t1.Field = 1
FROM Table1 as t1

它会在大约 3 秒内更新表格。

我真的很困惑 SQL Server 在没有更新任何记录的更新语句上阻塞了什么。

【问题讨论】:

  • 检查你的执行计划
  • 尝试过滤时是否被卡住了?可以交叉申请帮助 - 将内部连接更改为 CROSS APPLY (SELECT Field FROM Table2 WHERE Key = t1.Key AND FilterField = 'abc') t2 并摆脱 WHERE
  • 你能提供两个表上的索引吗?它像你介绍的那样简单吗?这不是您从某处运行并为'abc' 传递变量的某些动态 SQL 的简化版本,对吧?
  • 另外,表是否在同一个数据库和服务器上(即,不尝试通过链接服务器进行更新)?是否有任何其他进程锁定了其中一张表?

标签: sql-server join sql-update


【解决方案1】:

如果时间不是问题,您可以像这样创建单独的更新语句来运行,然后看看会发生什么:

SELECT 'UPDATE Table1 SET Field = ' + CAST(t2.Field as varchar(max)) + ' WHERE Key = ' + CAST(t1.[Key] as varchar(max))
FROM Table1 as t1
INNER JOIN Table2 as t2 on t1.[Key] = t2.[Key]
WHERE t2.FilterField = 'abc'

【讨论】:

    【解决方案2】:

    我们最近有类似的事情,我们的解决方案是:

    UPDATE t1 SET t1.Field = t2.Field
    FROM (SELECT DISTINCT Table1 as t1
    INNER JOIN Table2 as t2 on t1.Key = t2.Key
    WHERE t2.FilterField = 'abc') t3
    WHERE t1.key = t3.key
    

    其中 key 是某种形式的唯一性。对我们来说,导致问题的是订购。所以另一种选择是索引。这将我们的 6 小时查询缩短到大约一分钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2015-07-24
      • 2011-03-28
      • 2013-04-03
      相关资源
      最近更新 更多