优化 DB2 查询 - 为啥 bash“时间”输出保持不变?
Posted
技术标签:
【中文标题】优化 DB2 查询 - 为啥 bash“时间”输出保持不变?【英文标题】:Optimizing DB2 query - why does bash "time" output stay the same?优化 DB2 查询 - 为什么 bash“时间”输出保持不变? 【发布时间】: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
更多关于执行时间的重要信息,因为在前者中可以看到后台进程持续时间的变化,但在后者中看不到?
【参考方案1】:
优化器估计计时器(内部成本的测量),这些计时器不能一对一地转换为查询执行时间。因此,300% 的 timeron 差异并不意味着您会看到 300% 的运行时间差异。
测量一个或多个 SQL 语句的时间我建议使用 db2batch 和选项
-我完成了
【讨论】:
【参考方案2】:`从客户 f1 中选择 f1.name WHERE f1.nationkey = 22 并且存在(
select * from orders f2 inner join lineitem f3 on f2.orderkey=f3.orderkey 其中 f1.custkey=f2.custkey 和 f3.receiptdate BETWEEN '1992-06-11' AND '1992-07-11'
)`
【讨论】:
以上是关于优化 DB2 查询 - 为啥 bash“时间”输出保持不变?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 DB2 上执行查询时会收到 SyntaxErrorException?