【问题标题】:Stored Procedure(s) slow on initial execution存储过程在初始执行时很慢
【发布时间】:2009-12-01 21:22:40
【问题描述】:

组, 我还在学习 SQL,遇到了一个新问题。我有几个存储过程,它们的初始执行/连接速度很慢。例如,我有一个存储过程 (sp),我在应用程序中使用它来查找产品的价格。我早上第一次运行 sp 可能需要 20-40 秒才能执行。之后只需要 1-2 秒......我们还对 sp(s) 使用的表运行每日更新,更新后缓存被清除,并且再次初始运行需要 20-40 秒,然后是 1 -2 秒后。

有没有办法解决这个问题?不确定我是否应该在每日更新中添加一些内容以在更新后触发我的 sp(这可能会变得混乱),或者我是否可以在我的 sp 中添加一些内容来告诉它不清除缓存(这可能会导致空间问题)。我不知道该怎么办,初次执行后一切正常...

非常感谢任何建议。

【问题讨论】:

    标签: sql performance stored-procedures


    【解决方案1】:

    您看到速度差异的可能原因是缓存。一旦你运行了一个 SProc,执行计划就会进入缓存,而且速度要快得多。我们在我们的环境中所做的是在早上 7:30 左右将我们更常用的 SProcs 作为计划任务运行,以便在早上 8 点之前为我们的用户在开始工作日时“预热”。

    【讨论】:

      【解决方案2】:

      这有两个潜在的原因。

      1. 首先,任何存储过程第一次运行时都必须编译,这需要时间。然后(取决于供应商)缓存已编译的计划,以便后续执行不必重新编译它。甚至之后,如果有一段时间没有执行,缓存中的编译计划可能已经被覆盖,需要重新编译。

      2. 其次,(同样对于大多数供应商而言),当您运行任何查询时,会读取执行查询所需的数据页。但是查询处理器从缓存中“读取”它们。只有当数据页不在高速缓存中时,处理器才会进入磁盘。因此,它在一段时间内第一次需要数据时,通常不会到磁盘上获取数据,但是需要这些相同数据页的后续执行将从内存缓存中获取它们。由于磁盘 I/O 比 RAM I/O 慢几个数量级,这可能会导致查询执行时间出现非常显着的差异。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        相关资源
        最近更新 更多