2009-12-01 40 views
1

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

有没有办法解决这个问题?不确定我是否应该在每日更新中添加某些内容,以便在更新(可能会变得麻烦)时触发我的sp,或者如果我可以向我的sp添加一些信息,告诉它不清除缓存(这可能会导致空间问题)。我不知道该怎么做,在初始执行后一切都很好...

任何建议,非常感谢。

+1

你使用了哪个数据库? – 2009-12-01 21:26:36

回答

2

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

1

这有两个潜在的原因。

  1. 首先,任何存储过程首次运行它必须被编译,这需要时间。编译后的计划然后(取决于供应商)缓存,因此后续执行不必重新编译它。甚至以后,如果它在一段时间内还没有被执行,高速缓存中的编译计划可能会被覆盖并需要重新编译。其次,(对于大多数供应商而言),当您运行任何查询时,读取执行查询所需的数据页面。但查询处理器从缓存中“读取”它们。只有当数据页面不在缓存中时,处理器才会转到磁盘。因此,它第一次需要数据存储时间,它通常会为数据创建磁盘,但后续需要这些数据页的执行将从内存缓存中获取它们。由于磁盘I/O的速度比RAM I/O慢几个数量级,这可能会导致查询执行时间出现非常显着的差异。