有没有办法一致地确定哪两个存储过程更快?

时间:2014-01-02 20:51:28

标签: sql sql-server performance stored-procedures

我目前有两个存储过程,用于执行相同的操作。我有两个关于如何检索相当复杂的数据的想法,所以我写了两个,现在我需要确定哪一个更有效。

我尝试过使用Sql Profiler,客户统计信息和审核执行计划,但结果似乎没有结果。执行速度更快的两个存储过程中的哪一个从执行变为执行。

我猜测缓冲区缓存,统计信息和网络流量导致结果波动。我可以连续10次运行相同的存储过程并获得非常不同的持续时间(介于900毫秒和1400毫秒之间。我知道这不是很大,但它让我的决定更加困难)。

我知道我可以清除缓冲区缓存并重置统计信息,但我正在使用其他人经常使用的开发服务器。我不想用我的诡计让他们慢下来。

我正在使用的数据量肯定小于生产中的数据量,因此它可能有助于虚拟化实际数量的数据。

我想知道的是,是否有一种很好的方法来运行这两个查询并确定哪个表现更好。也许某些软件会运行每次查询100次并生成一个漂亮的图表或什么?我不想完全从等式中删除统计数据和缓存,因为这些将在生产中发挥作用。

如果事实证明查询是可以互换的,那么我会问一个关于哪一个理论上更有效率的后续问题。

谢谢!

更新:好的,看起来我需要添加更多数据,然后再回复您。也许这就是我需要做的全部。还要花时间阅读Dalorzo的帖子。如果测试结果更稳定,我会告诉你。

更新哦,是的,当我添加更多数据时,它变得更具决定性。当我添加更多数据时,其中一个存储过程几乎没有改变,另一个长度约为3倍。感谢大家!我认为更多的数据会有所帮助,但我希望有一种方法可以不涉及将大量内容塞入数据库。非常感谢。

3 个答案:

答案 0 :(得分:3)

随着更多的测试数据,时间可能会稳定,因为缓存起着较少的作用。此外,触发器之间的差异将变得更加明显。您还可以观察它们的渐近缩放行为。不同类型的连接和索引策略随着添加的数据而不同地扩展。

在未来几年内,将测试数据量增加到您希望在生产中看到的最大值。

另外,我不是比较平均值,而是比较95%最差的执行时间。您可能希望算法以稳定的方式运行。不稳定的性能变化可能会导致问题。

您可以更进一步,通过每次执行1000次,为每个函数生成执行时间的直方图。这样您就可以查看整个发行版并选择您喜欢的发行版。使用Excel作为XY散点图很容易绘制图表。

答案 1 :(得分:2)

您需要的是让两个查询的执行计划能够确定哪个更好。

这是一篇关于这个主题的好文章:

http://sqlmag.com/blog/comparing-execution-plans

答案 2 :(得分:1)

我试试这个

Set nocount on
Declare @i int=0, @count int = 100

Declare @timer datetime = GetDate()
While @i<@count begin
    DBCC DROPCLEANBUFFERS With NO_INFOMSGS
    Set @i = @i+1
    Exec Proc1
End
Select abs(DateDiff(s, @timer, GetDate())) as Proc1Time
Set @i=0
Set @timer = GetDate()
While @i<@count begin
    DBCC DROPCLEANBUFFERS With NO_INFOMSGS
    Set @i = @i+1
    Exec Proc2
End
Select abs(DateDiff(s, @timer, GetDate())) as Proc2Time

它没有告诉你你的触发有多快,哪一个更快。