我目前有两个存储过程,用于执行相同的操作。我有两个关于如何检索相当复杂的数据的想法,所以我写了两个,现在我需要确定哪一个更有效。
我尝试过使用Sql Profiler,客户统计信息和审核执行计划,但结果似乎没有结果。执行速度更快的两个存储过程中的哪一个从执行变为执行。
我猜测缓冲区缓存,统计信息和网络流量导致结果波动。我可以连续10次运行相同的存储过程并获得非常不同的持续时间(介于900毫秒和1400毫秒之间。我知道这不是很大,但它让我的决定更加困难)。
我知道我可以清除缓冲区缓存并重置统计信息,但我正在使用其他人经常使用的开发服务器。我不想用我的诡计让他们慢下来。
我正在使用的数据量肯定小于生产中的数据量,因此它可能有助于虚拟化实际数量的数据。
我想知道的是,是否有一种很好的方法来运行这两个查询并确定哪个表现更好。也许某些软件会运行每次查询100次并生成一个漂亮的图表或什么?我不想完全从等式中删除统计数据和缓存,因为这些将在生产中发挥作用。
如果事实证明查询是可以互换的,那么我会问一个关于哪一个理论上更有效率的后续问题。
谢谢!
更新:好的,看起来我需要添加更多数据,然后再回复您。也许这就是我需要做的全部。还要花时间阅读Dalorzo的帖子。如果测试结果更稳定,我会告诉你。
更新哦,是的,当我添加更多数据时,它变得更具决定性。当我添加更多数据时,其中一个存储过程几乎没有改变,另一个长度约为3倍。感谢大家!我认为更多的数据会有所帮助,但我希望有一种方法可以不涉及将大量内容塞入数据库。非常感谢。
答案 0 :(得分:3)
随着更多的测试数据,时间可能会稳定,因为缓存起着较少的作用。此外,触发器之间的差异将变得更加明显。您还可以观察它们的渐近缩放行为。不同类型的连接和索引策略随着添加的数据而不同地扩展。
在未来几年内,将测试数据量增加到您希望在生产中看到的最大值。
另外,我不是比较平均值,而是比较95%最差的执行时间。您可能希望算法以稳定的方式运行。不稳定的性能变化可能会导致问题。
您可以更进一步,通过每次执行1000次,为每个函数生成执行时间的直方图。这样您就可以查看整个发行版并选择您喜欢的发行版。使用Excel作为XY散点图很容易绘制图表。
答案 1 :(得分:2)
答案 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
它没有告诉你你的触发有多快,哪一个更快。