2012-07-25 62 views
1

我在使用Apache Derby DB进行性能测试时发现了一些奇怪的现象:Derby:表中的行越多,查询的速度越快?

我为性能测试做了五次测试运行。在每次运行之前,我在表格中插入一些数据,以便我进行第一次运行,例如表中有500k元组,第二次运行1000k,第五次运行2500k元组。

查询的执行时间是这样的:为200ms,450ms,700毫秒,500毫秒,550ms

也就是说,第四跑比第三运行速度更快,虽然越来越多的数据需要被扫描和获取在第四轮中。这很奇怪。

我能想象的唯一原因是Derby不时地优化一些内部结构或物理布局,或者一旦表中的数据超过特定阈值,无论如何,可以手动触发这种优化来获得单调而不减少的执行时间测量?

或者您是否知道此行为的确切原因?

在此先感谢!

回答

1

您可能不得不学习如何阅读查询计划输出以找出发生了什么,但我仍会冒险猜测:随着行被添加到表中,Derby服务器会定期注意到该表已经发生了实质性变化并且它会自动重新计算优化程序用于查询计划的统计信息,这可能会导致完全不同的查询计划。

要确认此情况,您可以在每次数据加载后自行尝试重新计算统计信息,以查看是否可以获得最佳查询计划:http://db.apache.org/derby/docs/10.8/tuning/ctunperfstatistics.html