我在使用Apache Derby DB进行性能测试时发现了一些奇怪的行为:
我进行了五次测试运行以进行性能测试。在每次运行之前,我在表格中插入一些数据,以便我在第一次运行时进行,例如表中有500k元组,第二次运行1000k,第五次运行2500k元组。
查询的执行时间如下:200ms,450ms,700ms,500ms,550ms
也就是说,第四次运行比第三次运行更快,尽管在第四次运行中必须扫描和获取更多数据。这很奇怪。
我能想象的唯一原因是Derby不时优化某些内部结构或物理布局,或者只要表中的数据超过某个阈值就会优化。无论如何,可以手动触发此优化以获得单调非递减的执行时间测量吗?
或者你知道这种行为的确切原因吗?
提前致谢!
答案 0 :(得分:1)
您可能必须学习如何阅读查询计划输出以找出正在发生的事情,但我还是冒险尝试:随着行添加到表中,Derby服务器会定期注意到表已经发生了重大变化size,它会自动重新计算优化程序用于查询计划的统计信息,这可能会导致完全不同的查询计划。
要确认这一点,您可以尝试在每次加载数据后自行重新计算统计信息,看看是否可以获得最佳查询计划:http://db.apache.org/derby/docs/10.8/tuning/ctunperfstatistics.html