如何获得准确的查询性能?


9

我正在尝试提高存储过程的性能。当我运行SP时,它几乎立即完成,就好像已缓存了某些内容一样。有人告诉我在SSMS中执行SP之前,请使用以下两行SQL:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

当我使用上面两行代码运行SP时,大约需要8秒钟。但是,这是否真的给了我真正的执行时间(就像我从应用程序中运行一样)?我怎么知道?


Answers:


9

这些命令可做两件事:

  • 清除页面缓存,该缓存存储已从磁盘中检索到的数据页面(通常,查询时间中最大的因素是磁盘访问)
  • 清除查询计划缓存,这意味着服务器需要创建一个新的查询计划。除了非常大的交易量外,这通常并不重要。

基本上,您所获得的时间与“最坏情况”场景相同-您刚刚重新启动了服务器,但内存中没有任何内容。后续运行无需支付从磁盘中提取数据的费用,因为这些页面已被加载到内存中。

这类似于现实情况-假设您要检查相同的数据,那么您的第一个运行特定查询的用户可能要比随后的运行等待更长的时间。

我喜欢使用的一种好方法是多次运行并取平均值。这在共享环境中特别有用,因为您无法完全控制诸如tempdb之类的共享资源。

您还可以使用以下命令来获取有关幕后实际发生情况的更多信息:

SET STATISTICS IO ON
SET STATISTICS TIME ON

这些将为您提供有关从磁盘(每个对象)读取页面,逻辑页面读取,花费在编译计划上的时间以及花费在执行查询上的时间的详细信息。


像往常一样出色的JNK。
2012年

乐意效劳!您恰巧是在问有关我已经处理过很多事情的问题。如果您问有关复制或内存管理的问题,我将没有太多要添加的内容:)
JNK 2012年

2
我知道SET STATISTICS IO ON,但我从来不知道SET STATISTICS TIME ON。谢谢JNK。
datagod 2012年

2
仅供参考,您可以使用SQL Sentry Plan Explorer生成实际计划,而无需使用所有SET设置即可获得很多此类信息。要获得多次运行(例如5次),您可以GO 5像在SSMS中那样简单地结束批处理。它是免费下载,我不打算向您出售任何东西。sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand

1
@JNK好吧,可以肯定的是,它是免费的,可以节省时间,并且显示出退出Management Studio不可能或非常麻烦的信息。我在那里工作。:-)
亚伦·伯特兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.