优化 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?

DB2 查询优化

为啥 MySql 不自动优化 BETWEEN 查询?

db2 优化基础 查询运行时间最长的SQL

如何针对 db2 数据库优化 SQL/Python 选择查询?

确定应该在 DB2 中创建哪些索引以优化特定查询的性能