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

O.O*_*O.O 9 performance sql-server-2008 ssms query-performance

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)

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

JNK*_*JNK 9

这些命令做两件事:

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

您基本上获得了相当于“最坏情况”情景的时间 - 您刚刚重新启动了服务器并且内存中没有任何内容。后续运行不需要支付从磁盘中提取数据的成本,因为这些页面已经加载到内存中。

这类似于现实世界的情况——假设您正在检查相同的数据,您的第一个运行特定查询的用户可能需要等待比后续运行更长的时间。

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

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

SET STATISTICS IO ON
SET STATISTICS TIME ON
Run Code Online (Sandbox Code Playgroud)

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

  • 我知道 SET STATISTICS IO ON,但我从来不知道 SET STATISTICS TIME ON。谢谢 JNK。 (2认同)
  • 仅供参考,通过使用 SQL Sentry 计划资源管理器生成实际计划,您可以在没有所有 SET 设置的情况下获得大量此类信息。并且要获得多次(例如 5 次)运行,您可以像在 SSMS 中一样简单地使用“GO 5”结束批处理。这是一个免费下载,我不想卖给你任何东西。http://www.sqlsentry.net/plan-explorer/sql-server-query-view.asp (2认同)