优化问题:将触发器INSERTED或DELETED行复制到表变量中

时间:2010-11-12 12:59:52

标签: sql-server optimization triggers

我一直遇到SQL触发器的性能问题。该问题与使用带有INSERTED触发器表的select语句时执行SQL查询有关。

SELECT x FROM y WHERE x IN ( SELECT x FROM INSERTED )

查询执行计划指向( SELECT x FROM INSERTED )的时间比预期的要长得多。我们在这里谈论x1000s行。

如果我创建一个表变量,并选择INSERTED中的行到表变量中,那么在'IN'子句中使用表变量它会更快。

我的问题是为什么这会更快?我已经知道它可能是什么了。我已经读过INSERTED表是一个虚拟表,它来自事务日志,因此比使用表变量需要更长的时间来读取。但是,我认为从INSERTED表中选择行到表变量会否定在'IN'子句中使用表变量的积极影响。

任何想法为什么会这么快?

1 个答案:

答案 0 :(得分:0)

难道你不能只用JOIN表尝试常规INSERTED吗?那些通常比那些子查询表现得更好:

SELECT x 
FROM y 
INNER JOIN INSERTED i ON y.x = i.x

不知道你的所有细节,我们无法确定这是否会有所帮助 - 但它绝对值得一试!