测试时使用缓存数据的存储过程性能不佳

lif*_*ney 4 sql-server optimization performance-tuning

我有一个存储过程,第一次运行大约需要 15 秒,后续运行需要 1 到 2 秒。如果我等待一个小时并再次运行它,则再次需要 15 秒。

我猜测它在后续运行中使用缓冲池中的缓存数据,而第一次它必须将数据从磁盘加载到缓冲池。我正在尝试调整此存储过程,但第一次运行后我无法测试我的更改,因为它只需要 1 到 2 秒。

我知道我可以使用该DBCC DROPCLEANBUFFERS命令释放缓存并运行我的存储过程,但我不允许在工作中清除缓存。我WITH RECOMPILE也尝试过,但这只会创建一个新计划,但仍然使用缓存的数据。是否有另一种方法强制存储过程不使用缓存数据?

Dav*_*oft 8

不。保存实际执行计划中的 CPU 和等待统计信息,您会看到 15 秒的持续时间。然后努力最小化 CPU 和读取。如果您看到 X 个读取 = 15 秒的 PAGEIOLATCH 等待,那么您可以合理估计减少读取的影响。

重要的是发现并修复导致缓冲池混乱的查询。您的查询可能至少有部分原因,但您需要发现为什么该查询的数据没有保留在缓存中。可能是其他查询,可能需要更多内存,或者更好的压缩,或者避免表扫描等。

  • 可能还值得查看那些要求大量内存授予的查询,这些查询会从缓冲池中逐出有用的数据。 (7认同)