病理插入时间

问题描述 投票:0回答:1

我有一个类似这样的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。如果有什么办法可以解决性能不稳定的问题,我会很高兴。

sql sql-server performance database-performance
1个回答
0
投票

特别感谢@MartinSmith,谜底基本揭晓。@TomTom在触发器方面是对的,@AaronBertrand在编译方面是对的。问题是

触发重新编译

在跟踪日志中,有触发器的重新编译事件,对应着插入的长时间执行。编译导致CPU和IO都增加。而在编译过程中,CPU和IO都会增加。option (recompile) 在存储过程中引起了大约25ms的延迟,重新编译表上的触发器则完全不同,这就是服务器在半秒内所做的事情。执行计划并没有从缓存中被驱逐,所以内存的压迫使用不可能是原因,大概是由于performace的原因被重新编译。是什么让优化器认为这是一个好主意,这将是进一步研究的课题。

© www.soinside.com 2019 - 2024. All rights reserved.