如何衡量存储过程的性能表现?

10
我在使用不支持分析器的SQL Server 2005版本,想要找出比较两个存储过程性能的最佳方法。我已经运行了每个过程的执行计划,但是我不确定应该关注提供的哪些指标。我是否需要逐个加总各种成本?什么是最好的方法?
谢谢。
7个回答

19

看看这篇文章:测量 SQL 性能

如果你不想注册免费账户,这里有一个解决方案 1:

DECLARE @start datetime, @stop datetime
SET @start = GETDATE()
EXEC your_sp
SET @stop = GETDATE()

第二点:

SET STATISTICS TIME ON
EXEC your_sp

第三方:

SET STATISTICS IO ON
EXEC your_sp

顺便说一下,这个网站有一些不错的文章。我建议您注册一下。这是免费的。


7
第一选项别忘了打印 "Took: " + CONVERT(varchar(20),datediff(ms,@start,@stop)/1000.0)+' 秒'。 - KM.
2
SET STATISTICS TIME ON 很好地运作了,真没想到,谢谢! - corymathews
当数据被缓存时怎么办?例如,我经常运行一个查询,第一次运行需要3分钟。然后我再次运行相同的查询,只需要15秒——显然SQL Server已经缓存了数据或查询计划,所以我无法总是重现第一次缓慢的3分钟场景。在没有数据缓存/计划缓存干扰测试的情况下,如何始终重现缓慢的3分钟运行时间? - Chris Smith
1
看起来我回答了自己的问题 - 似乎 dbcc dropcleanbuffers 将清除缓存并产生一致的结果 - https://www.mssqltips.com/sqlservertip/1360/clearing-cache-for-sql-server-performance-testing/ - Chris Smith

3

问题在于你优化的目标是什么?是速度还是资源利用率?

如果是速度,那么在查询分析器中,我会查看多次运行之间的执行情况,进行更改并再次计时。

如果是资源利用率,我会查看执行计划。在这种情况下,我会从最糟糕的问题开始,并逐个解决。将它们加起来可以告诉你整体性能,但大多数情况下只有一两个项目是瓶颈。


2

1

像大多数问题一样,答案取决于... 最终的分析中,唯一重要的度量标准是最终用户的感知,这可能会受到许多因素的影响,包括不仅仅是存储过程,还有网络性能、使用模式(sProc每天被调用20次还是每秒1000次?)等等,而且sProc可能不是决定性因素。

但是,如果存储过程是某个功能对最终用户感知产生重大负面影响的“拼图块”,那么您必须查看运行存储过程的经过时间。但是,这本身可能会受到许多潜在指标的影响,为了解决这个问题,您需要分析它们所有来确定哪一个是整体存储过程性能的主要或支配贡献者。


0
你总可以构建一个测试工具来调用你的存储过程并测量调用时间。不幸的是,你无法获取关于哪些部分导致存储过程变慢的详细信息。
你总可以在查询分析器中手动运行存储过程并以此方式测量结果。.NET 工具只是自动化了这个过程。

0

简单粗暴的解决方案是使用打印语句来输出各个部分的执行时间。如果性能问题更加微妙,只在生产环境中出现,这种方法可能无法帮助,但如果你能在测试环境中重现该问题,那么应该没问题。


0
如果您想比较两个存储过程或语句的性能,一个方便的技巧是在查询分析器中选择这两个 SQL 代码块并运行查询计划。该计划将告诉您相对于彼此每个块的成本百分比。这并非百分之百可靠。我曾经看到它告诉我其中一个更便宜,但实际运行时明显更昂贵,但大部分情况下这是一个不错的快速技巧。

另外,请确保设置IO统计信息并运行每个块。这将告诉您每个块消耗了多少IO。 - Matt Wrock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接