sql - 动态 SQL - 执行时间长 - 仅限第一次

标签 sql sql-server tsql sql-server-2012

我有存储过程,它根据输入参数构建动态 SQL 语句,然后执行它。

其中一个查询导致超时,所以我决定检查一下。第一次(也是第一次)执行 issue 语句很慢(30 秒 - 45 秒),每次下一次执行需要 1-2 秒。

为了重现该问题,我正在使用

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

我真的很困惑问题出在哪里,因为普通的如果SQL语句很慢,它总是很慢。现在,它只有第一次有很长的执行时间。

是否有可能,本身很慢并且需要优化或者问题可能是由其他原因引起的?

执行计划如下,但对我来说没有什么奇怪的:

enter image description here

最佳答案

原因很简单,第一次和第一次需要更长的时间,然后所有以后的执行都很快完成。这个谜背后的原因是“缓存执行计划”。

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 FREEPROCCACHEDBCC DROPCLEANBUFFERS commanda 基本上刷新了 BUFFER CACHE MEMORY并导致您的存储过程在下次执行时创建一个新的执行计划。希望这会稍微清除迷雾:)

关于sql - 动态 SQL - 执行时间长 - 仅限第一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257520/

相关文章:

sql - Oracle 过程对在过程之外运行良好的选择查询感到不满

mysql - 合并相关记录

mysql - SQL 行返回顺序

c# - 集中 C# 和 sql 使用的业务逻辑

sql - 将执行动态查询的结果插入表中

mysql - 总计成本并显示每个项目

mysql - 如何在 MySQL 表上添加自定义 CHECK 约束?

SQL——对在多行键上连接的表使用 IN

sql - 如何在Sql Server 中为主键指定自定义排序顺序

sql - 不能排除以前的非重复行