我有一个类似这样的SQL查询。
INSERT INTO dbo.SomeTable (col1, col2,...)
SELECT col1, col2,...
FROM @tempTable
临时表中只有几行(5行或更少) 而插入数据需要2毫秒的时间 到目前为止还不错。
但是,有一次在几十次调用中,它需要大约500毫秒的时间来执行。它是不可重复的,如果我删除最后几行,然后再以同样的方式插入同样的数据,就会像预期的那样需要2毫秒。
250倍的随机减速似乎太极端了,我无法想象任何解释。服务器比较闲置,内存充足,db在SSD上。最让我不解的是,不仅耗时更长。而且CPU的使用时间也从2ms增加到500ms。因为执行计划还是一样的,插入的数据也完全一样,怎么突然多花了250倍的工作量?另外,IO读数从cca 200增加到cca 6000。如果有什么办法可以解决性能不稳定的问题,我会很高兴。
特别感谢@MartinSmith,谜底基本揭晓。@TomTom在触发器方面是对的,@AaronBertrand在编译方面是对的。问题是
触发重新编译
在跟踪日志中,有触发器的重新编译事件,对应着插入的长时间执行。编译导致CPU和IO都增加。而在编译过程中,CPU和IO都会增加。option (recompile)
在存储过程中引起了大约25ms的延迟,重新编译表上的触发器则完全不同,这就是服务器在半秒内所做的事情。执行计划并没有从缓存中被驱逐,所以内存的压迫使用不可能是原因,大概是由于performace的原因被重新编译。是什么让优化器认为这是一个好主意,这将是进一步研究的课题。