我有一点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有行时是否会影响我的查询性能?
非常感谢任何建议。
答案 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
表上的查询优化是有限的