【问题标题】:Comparing stored procedure performance ex and new version比较存储过程性能 ex 和新版本
【发布时间】:2010-02-22 13:44:12
【问题描述】:

我确实在 sp 上使用的表上创建了两个新索引。 新结果表明,在有问题的连接部分,扫描被转换为搜索。我认为寻找比扫描操作更好。另一方面,所花费的时间与没有新索引时所花费的时间大致相同。

很明显,在将我的新版本 sp 投入生产之前,我如何才能感到满意。

例如,改变sp的参数可以帮助我查看新版本是否比旧版本快还是什么?

问候 bk

【问题讨论】:

  • 我假设您使用的是 SQL Server?

标签: sql sql-server performance stored-procedures


【解决方案1】:

要做的几件事:
1) 通过在每次测试运行后清除数据和执行计划缓存来确保您公平地比较性能。您可以使用以下方法清除这些(建议仅在您的开发/测试环境中执行此操作):

CHECKPOINT -- force dirty pages in the buffer to be written to disk
DBCC DROPCLEANBUFFERS -- clear the data cache
DBCC FREEPROCCACHE -- clear the execution plan cache

2) 运行 SQL Profiler 以记录每种情况的读取/写入/CPU/持续时间(有/无索引)。这将为您提供一系列指标进行比较(即,与 SSMS 中显示的时间相反)。
编辑: 要运行 SQL Profiler 跟踪,请在 Management Studio 中转到工具 -> SQL Server Profiler。出现提示时,指定要对其运行跟踪的数据库服务器。将出现“跟踪属性”对话框 - 您应该只需单击“运行”即可开始运行默认跟踪。然后只需执行您的存储过程并查看它出现在 SQL Profiler 中 - 它会在旁边显示持续时间、读取次数等。

3) 使用比现有数据量大得多的数据进行测试。如果您使用少量数据进行测试,那么仅从持续时间通常很难看出差异。

我最近blogged here 讨论了如何公平地测试查询的不同变体的性能,其中更详细地介绍了我是如何做到的。

【讨论】:

  • 谢谢 Ada,能否请您扩展上面的第二项。问候 bk
  • 我一直在做上面的项目,但是第一个项目并没有像你在博客上提到的那样工作,比如比较两个纸男孩,看看哪一个能最快地完成给定的一轮。明确的方法似乎行不通。一旦我运行SP旧版本,第一次需要很多时间,我使用clear方法运行SP新版本。另一方面,当我再次清除并第二次运行 SP 旧版本时,所用的时间很少。第一次,旧版 SP:4:24 分钟 第二次,旧版 SP:0:18 分钟 我错过了什么吗?
  • @blgnklc - 如果您在每次运行 sproc 之间执行所有 3 行“清除”,并且时间之间存在如此巨大的差异,那么一定有其他因素影响它(例如,服务器通常负载很重)
  • @AdaTheDev - 那么在运行了三行之后,下面这条消息的意义何在。我认为它可以解决每个新的 SP 操作......然后我看到还有其他事情可能会影响...... DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。 DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。
  • @blgnklc - 我不确定我是否跟随。这些消息只是 SQL 的那 3 个“cleardown”行的输出,只是说正在运行的 DBCC 命令已经完成。在这 3 条语句块完成后,当您下次运行存储过程时,它将在清除缓存上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多