空连接的UPDATE性能

时间:2014-12-08 14:50:07

标签: sql sql-server performance tsql

我有一点sql

DECLARE @tmpTable TABLE(idTransaction int PRIMARY KEY, Value money)
DECLARE @idStatement int = 0

UPDATE T 
       SET idStatement = @idStatement
FROM tbl_Transaction T
INNER JOIN @tmpTable ST on T.id = ST.idTransaction 

表tbl_Transaction中有大约250,000行(我认为这是其中的原因),但是当我运行查询时,执行大约需要650ms,即使tmpTable完全为空并且join将不会更新任何行。

我认为这与UPDATE如何运作有关,但任何人都可以解释为什么?我知道对于一个空表我可以检查行数,但我想知道当tmpTable有行时是否会影响我的查询性能?

非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

这是因为它不会与表变量上的索引匹配,就像它与临时表一样。你可以把它转换成临时表,这很可能解决问题。或者,你可以试试这个:

UPDATE T 
       SET idStatement = @idStatement
FROM tbl_Transaction T
WHERE T.id n IN (SELECT ST.idTransaction from @tmptable)

这可能比临时表慢,但比具有表变量

的连接更快

答案 1 :(得分:1)

即使您更新为相同的值

,也会触发触发器
UPDATE T 
       SET idStatement = @idStatement
 FROM tbl_Transaction T
INNER JOIN @tmpTable ST 
   on T.id = ST.idTransaction 
  and idStatement <> @idStatement

如果您还需要更新为null

or (@idStatement == null and idStatement is not null)

如评论中所述,尝试#temp
表上的查询优化是有限的