2010-11-12 15 views
0

我一直有与SQL触发器性能问题。该问题涉及在使用INSERTED触发器表的select语句时执行SQL查询。优化问题:复制触发插入或删除行到表变量

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

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

如果我创建一个表变量,而我选择从插入到表变量中的行,然后用它的速度要快得多的“IN”子句中的表变量。

我的问题是,为什么是这样快?我已经知道它可能是什么。我读过INSERTED表是一个虚拟表,它来自事务日志,因此比使用表变量花费的时间要长得多。但是,我认为将INSERTED表中的行选入表变量将会否定在'IN'子句中使用表变量的积极效果。

任何想法,为什么这是更快?

+0

对此深感抱歉,我会记住下一次! – jaffa 2010-11-14 15:37:17

回答

0

你不能只是尝试定期JOININSERTED表?这些往往比那些子查询执行显著更好:

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

不知道所有的细节,这是不可能确切地知道这是否会在所有帮助 - 但它是defintely值得一试!

+0

我实际上使用一个UPDATE语句在一个单独的行上,当它的任何一个子表被更新时(它有1000行),这个语句用一个时间戳更新。为什么选择插入到临时表中的INSERTED行比在语句中直接使用它更快? – jaffa 2010-11-14 15:39:26