我在TPC-H模式上有一个DB2查询,我试图用索引进行优化。我可以从db2expln输出中看出,当索引可用时,估计成本显着降低(300%)。 但是,我也试图测量执行时间,并且在使用索引执行查询时它不会发生显着变化。
我在SSH终端工作,执行查询并将输出写入
等文件(time db2 "SELECT Q.name FROM
(SELECT custkey, name FROM customer WHERE nationkey = 22) Q WHERE Q.custkey IN
(SELECT custkey FROM orders B WHERE B.orderkey IN
(SELECT orderkey FROM lineitem WHERE receiptdate BETWEEN '1992-06-11' AND '1992-07-11'))") &> output.txt
我分别进行了10次测量:1)没有索引,2)在lineitem.receiptdate上有索引,3)在lineitem.receiptdate和customer.nationkey上有索引,
计算出的平均时间和标准差均在同一范围内。
我在索引创建后执行了RUNSTATS ON TABLE schemaname.tablename AND DETAILED INDEXES ALL
。
我在this上发布了关于time
命令输出的帖子,据我所知sys
+ user
时间与我的测量值相关。添加sys
+ user
时间没有变化,而不是real
。
sys + user大约是44毫秒,真实大约是1秒。
任何提示为什么我看不到时间的变化?我是否解释time
输出错误? db2expln
中的优化程序估算是误导性的吗?
免责声明:我应该在大学做一个关于这个的介绍,所以它是技术上的功课,但是因为它更像是一个理解问题,而不是"请让我的代码工作"我希望在这里发布它是合适的。此外,我知道查询可以简化,但我的问题不是这个。
答案 0 :(得分:1)
优化器估计计时器(内部成本的测量),并且这些计时器不能一对一地转换为查询执行时间。因此,计时器中300%的差异并不意味着您将在运行时看到300%的差异。
测量一个或多个SQL语句的时间我建议将db2batch与
选项一起使用-i complete
答案 1 :(得分:-1)
`SELECT f1.name FROM customer f1 在哪里f1.nationkey = 22并且存在(
从f2.orderkey = f3.orderkey上的订单f2内部联接lineitem f3中选择* 其中f1.custkey = f2.custkey和f3.receiptdate BETWEEN' 1992-06-11' AND' 1992-07-11'
)`