我有存储过程,它根据输入参数构建动态 SQL 语句,然后执行它。
其中一个查询导致超时,所以我决定检查一下。第一次(也是第一次)执行 issue 语句很慢(30 秒 - 45 秒),每次下一次执行需要 1-2 秒。
为了重现该问题,我正在使用
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
我真的很困惑问题出在哪里,因为普通的如果SQL语句很慢,它总是很慢。现在,它只有第一次有很长的执行时间。
是否有可能,本身很慢并且需要优化或者问题可能是由其他原因引起的?
执行计划如下,但对我来说没有什么奇怪的:
最佳答案
原因很简单,第一次和第一次需要更长的时间,然后所有以后的执行都很快完成。这个谜背后的原因是“缓存执行计划”。
While working with Stored Procedures, Sql server takes the following steps.
1) Parse Syntax of command.
2) Translate to Query Tree.
3) Develop Execution Plan.
4) Execute.
第一两步仅在您创建存储过程时发生。
第 3 步仅在第一次执行时发生,或者如果 CACHED PLAN 已从 CACHE MEMORY 中刷新。
第四步在每次执行时发生,如果计划仍在缓存中,这是在第一次执行之后发生的唯一步骤。
在您的情况下,很容易理解,第一次执行需要很长时间,然后很快就会执行。
重现您执行的“问题”
DBCC FREEPROCCACHE
和 DBCC DROPCLEANBUFFERS
commanda 基本上刷新了 BUFFER CACHE MEMORY
并导致您的存储过程在下次执行时创建一个新的执行计划。希望这会稍微清除迷雾:)
关于sql - 动态 SQL - 执行时间长 - 仅限第一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257520/