【发布时间】:2016-07-10 17:45:13
【问题描述】:
我有一个关于 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。
我阅读了关于time 命令输出的this 帖子,据我了解sys+user 时间应该与我的测量相关。添加的sys+user 时间没有变化,real 也没有变化。
sys + user 大约是 44 ms,real 大约是 1s。
任何提示为什么我看不到时间的变化?我解释time 输出错误吗? db2expln 中的优化器估计是否具有误导性?
免责声明:我应该在大学里做一个关于这个的演讲,所以它在技术上是家庭作业,但因为它更多的是一个理解问题,而不是“请让我的代码工作”,我希望在这里发布它是合适的。另外,我知道可以简化查询,但我的问题与此无关。
【问题讨论】:
-
查询需要多长时间?
time对于几百毫秒以下的任何事情都是不可靠的。 -
已编辑,所以也许我的查询太短了。是因为时间自己的执行时间太长了,如解释here?
-
您还需要了解
time测量它执行的进程的系统+用户CPU时间。在这种情况下,它正在测量db2前端进程的 CPU 时间。该进程(通过 IPC)与另一个进程(DB2 后端进程 -db2bp)进行通信,后者通过 TCP/IP 或 IPC 与 DB2 数据库引擎进行通信。sys+user时间不会报告后端进程或数据库引擎消耗的 CPU 时间。 -
感谢您添加此内容。所以
real提供了比sys+user更多关于执行时间的重要信息,因为在前者中可以看到后台进程持续时间的变化,但在后者中看不到?