我正在调整一个存储过程,当用户登录我们的网站时加载的第一页会使用该存储过程,并且该过程非常常用。当我第一次运行该程序时,它会在大约 10 到 12 秒内运行,但当我第二次运行它时,它会在 1 秒或更短的时间内执行。
我假设这是因为优化器第二次读取缓存页面。当我针对当前 proc 测试我的调整过程时,我必须在每次运行之间至少等待一个小时来测试它们的实际性能,而不使用任何缓存。
不幸的是,我没有释放缓存的选项,因为我们的 DBA 不允许这样做。这种类型的测试非常耗时,因为每次我进行一些更改时,我都必须等待至少一个小时来比较运行时间。
我很确定有更好的测试方法。你使用什么样的测试策略?现实世界的应用程序是使用缓存数据还是从磁盘读取?如果您能对此提供任何见解并提供一些文章,我将不胜感激。谢谢!
我看看实际的执行计划。大多数情况下,除了警告/问题和相关指标之外,它还会指示您的查询花费的大部分时间。如果您将执行计划上传到Paste The Plan,您可以在 DBA.StackExchange 问题中将其链接以在此处获得更多帮助。
我不关心冷缓存和热缓存,因为如果有实际问题需要调整,它可能与数据页是否已缓存(大部分情况下)无关。在最近对一个相关问题的回答中查看有关为什么会这样的相关信息。
您还可以查看I/O 统计信息和时间统计信息,这也有助于查明问题的根源。它们可以显示较长的 CPU 时间,这可以指示多个事物,例如繁重的计算操作,例如可能是逐行运行的标量函数。它还可以显示大的Physical Reads或Logical Reads,这可能表明存在索引问题,因为您的执行计划没有使用最有效的索引或索引操作,例如索引扫描或表扫描。
存储过程的另一个常见问题是参数嗅探(当过程具有参数时)。确定这是否是问题的一种快速方法是将
OPTION (RECOMPILE)
orWITH RECOMPILE
查询提示添加到您的过程中。如果问题消失,则可能是参数嗅探问题。这并不意味着这是解决方案,因为该查询提示会导致程序在每次运行时都重新编译(如果经常这样,可能会对服务器的 CPU 造成计算负担)。相反,我有时用它来测试这个问题。但在某些情况下,这是一个有效的解决方案。