Sql server 优化问题:将触发器插入或删除的行复制到表变量中

Sql server 优化问题:将触发器插入或删除的行复制到表变量中,sql-server,optimization,triggers,Sql Server,Optimization,Triggers,我的SQL触发器一直存在性能问题。该问题与使用select语句和插入的触发器表时执行SQL查询有关 SELECT x FROM y WHERE x IN ( SELECT x FROM INSERTED ) 查询执行计划指向SELECT x FROM INSERTED,所用时间比预期长得多。我们这里说的是X1000行 如果我创建一个表变量,并从插入到表变量中的行中选择行,那么在'IN'子句中使用表变量会快得多 我的问题是为什么这样更快?我已经知道可能是什么了。我已经读到,插入的表是一个虚拟表,

我的SQL触发器一直存在性能问题。该问题与使用select语句和插入的触发器表时执行SQL查询有关

SELECT x FROM y WHERE x IN ( SELECT x FROM INSERTED )
查询执行计划指向SELECT x FROM INSERTED,所用时间比预期长得多。我们这里说的是X1000行

如果我创建一个表变量,并从插入到表变量中的行中选择行,那么在'IN'子句中使用表变量会快得多

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


你知道为什么这要快得多吗?

难道你就不能尝试对插入的表进行常规联接吗?这些查询通常比那些子查询的性能要好得多:

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

不知道你所有的细节,不可能确定这是否会有帮助,但绝对值得一试

对不起,下次我会记得的!实际上,我在一行上使用了一个UPDATE语句,当它的子表中有1000行被更新时,它会被一个时间戳更新。为什么选择插入的行到临时表中要比直接在语句中使用它快?