插入时间

cbjzeqam  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(275)

我有一个类似这样的sql查询:

INSERT INTO dbo.SomeTable (col1, col2,...) 
    SELECT col1, col2,... 
    FROM @tempTable

temp表中只有几行(5行或更少),插入数据大约需要2毫秒。到现在为止,一直都还不错。
但是,每几十次调用中就有一次,执行大约需要500毫秒。它是不可重复的,如果我删除最后一行并再次以相同的方式插入相同的数据,则会像预期的那样延迟2毫秒。
250倍的随机减速似乎太过极端,我无法想象任何解释。服务器相当空闲,内存充足,db在ssd上。最让我困惑的是,这不仅需要更长的时间。cpu使用率也从2ms增加到500ms。由于执行计划仍然相同,插入的数据也完全相同,有什么突然需要额外250倍的工作?此外,i/o读取从cca 200增加到cca 6000。我很乐意为任何想法如何修复性能不稳定。

pw9qyyiw

pw9qyyiw1#

多亏了@martinsmith,谜团才得以揭开@tomtom在触发器方面是正确的,@aaronbertrand在编译方面是正确的。问题是
触发重新编译
跟踪日志中存在与长时间执行插入相对应的触发器重新编译事件。编译导致cpu和io都增加。而 option (recompile) 在存储过程中会导致大约25ms的延迟,表上触发器的重新编译是完全不同的情况,这是服务器在半秒钟内所做的事情。执行计划不会从缓存中逐出,因此内存使用可能不是原因,可能是因为性能原因而重新编译它。优化器认为这是一个好主意的原因将是进一步研究的主题。

相关问题