【发布时间】: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