组, 我还在学习SQL,我遇到了一个新问题。我有几个存储过程,它们的初始执行/连接速度很慢。例如,我有一个存储过程(sp),我在应用程序中使用它来查找产品的价格。我第一次在早上运行sp时可能需要20-40秒才能执行。之后它只需要1-2秒......我们还对sp使用的表运行每日更新,更新后缓存被清除,并且初始运行需要20-40秒,然后1 -2秒后。
这有什么办法吗?不确定我是否应该在每日更新中添加一些东西,以便在更新后激活我的sp(这可能会变得混乱),或者我是否可以向我的sp添加一些东西告诉它不清除缓存(这可能会导致空间问题)。我不知道该做什么,在最初的执行后一切都很好......
非常感谢任何建议。
答案 0 :(得分:2)
您看到速度差异的可能原因是缓存。一旦你运行了SProc,执行计划进入缓存并且速度更快。我们在我们的环境中所做的是在早上7:30左右将我们更常用的SProcs作为预定任务运行,以便在我们的用户开始工作时,他们将在早上8点“预热”。
答案 1 :(得分:1)
这有两个可能的原因。
首先,第一次运行任何存储过程必须进行编译,这需要时间。然后编译的计划(取决于供应商)被缓存,因此后续执行不必重新编译它。即使以后,如果它还没有在一段时间内执行,缓存中的编译计划可能已被覆盖,需要再次重新编译。
其次,(对于大多数供应商而言),当您运行任何查询时,将读取执行查询所需的数据页。但查询处理器从缓存中“读取”它们。只有当数据页不在缓存中时,处理器才会进入磁盘。因此,它第一次需要数据时间,它通常会为数据提供磁盘,但后续需要相同数据页的执行将从内存缓存中获取它们。由于磁盘I / O比RAM I / O慢几个数量级,因此这会导致查询执行时间产生非常大的差异。