查看: 18570|回复: 30

[精华] 优化器入门案例

[复制链接]
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
跳转到指定楼层
1#
发表于 2007-12-20 03:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简介:一条查询语句,之前运行时间大约0.5秒,运行完runstats后400秒。

背景:
Operating system is: Linux
OSS reports operating system level as: #1 SMP Fri Feb 24 17:04:34 EST 2006.2.6.9-34.ELhugemem.

Server is running MPP/EEE.
DB21085I Instance "adtimpra" uses "32" bits and DB2 code release "SQL08025" with level identifier "03060106".
Informational tokens are "DB2 v8.1.2.112", "s060429", "MI00155", and FixPak "12".
Product is installed at "/opt/IBM/db2/V8.1".

[e] DB2_VIEW_REOPT_VALUES=YES
[i] DB2LINUXAIO=TRUE
[i] DB2_SCATTERED_IO=ON
[i] DB2_USE_ALTERNATE_PAGE_CLEANING=ON
[i] DB2_HASH_JOIN=no[i] DB2_RR_TO_RS=YES
[i] DB2COMM=TCPIP
[i] DB2_PARALLEL_IO=*
[g] DB2_EEE_LICENSE_POLICY=xxxxxxxxxxxxxxxxx

系统为单节点MPP

问题描述:
如下查询语句,之前运行时间大约0.5秒,运行完runstats后400秒。
SELECT distinct D.DEID FROM ADTIMPSA.LDAP_DESC AS D WHERE D.AEID=? AND D.DEID IN ((((SELECT EID FROM ADTIMPSA.ERSERVICE WHERE ERSERVICE = ?) UNION (SELECT EID FROM ADTIMPSA.ERHOST WHERE ERHOST = ?)) INTERSECT (SELECT EID FROM ADTIMPSA.ERUID WHERE ERUID = ?)) INTERSECT (SELECT EID FROM ADTIMPSA.OBJECTCLASS WHERE OBJECTCLASS = ?) INTERSECT (SELECT EID FROM ADTIMPSA.OBJECTCLASS WHERE OBJECTCLASS = ?)) FOR FETCH ONLY

通过作db2exfmt得到之前与之后的访问计划,在这里,我们把之前的0.5秒使用的计划称为good case,把之后400秒的计划称为bad case。

good case:


bad case:


问题分析:
从上面的两个图来看,在bad case中使用了OBJECTCLASS与LDAP_DESC_ALLTEL索引进行nested loop join,然后结果集与ERUID索引进行merge join。而在good plan中,并没有使用OBJECTCLASS索引,而是4层嵌套的nested loop join。并且我们可以看出来,bad case中的cost estimation甚至小于good case得估算值,因此我们可以首先认为,问题发生在bad case underestimate了cost。

直观地看,在bad case中最引人注目的就是那个MSJOIN。单看那个cpu cost与其右下的FILTER得cpu cost,从直觉上看来问题8成出在这里。

那个filter得cost为38188,而其parent node得MSJOIN的cost只有117,看起来给人的感觉就是这个MSJOIN underestimate了真实的cost。

到下方的MSJOIN(7)去看,我们有:
        7) MSJOIN: (Merge Scan Join)
                Cumulative Total Cost:                 117.93
                Cumulative CPU Cost:                 1.66068e+07
                Cumulative I/O Cost:                 22.3473
                Cumulative Re-Total Cost:         117.93
                Cumulative Re-CPU Cost:         1.66068e+07
                Cumulative Re-I/O Cost:         22.3473
                Cumulative First Row Cost:         117.93
                Estimated Bufferpool Buffers:         4.00912

                Arguments:
                ---------
                EARLYOUT: (Early Out flag)
                        LEFT
                INNERCOL: (Inner Order Columns)
                        1: Q1.DEID(A)
                JN INPUT: (Join input leg)
                        OUTER
                OUTERCOL: (Outer Order columns)
                        1: Q4.EID(A)
                TEMPSIZE: (Temporary Table Page Size)
                        4096

                Predicates:
                ----------
                5) Predicate used in Join
                        Relational Operator:                 Equal (=)
                        Subquery Input Required:         No
                        Filter Factor:                         8.10564e-08

                        Predicate Text:
                        --------------
                        (Q4.EID = Q1.DEID)


        ……

我们看到了EARLYOUT标示,说明MSJOIN把右子树的cost从3万多一下子减到了100多。所以说估计是统计数据的问题,或者说是数据的分布问题影响了optimizer的判断。

继续看下去,我们突然发现索引LDAP_DESC_ALLTEL的card为9e+18,这个数值好像夸张了点。询问客户,发现客户由于运行TIM软件需要手工调整一些索引的card。

在本地作db2look simulation,发现如果使用正常的数值会得到与good case bad case都不相同的计划,而且客户由于TIM的缘故无法更改该数值。

不过既然我们清楚了,db2使用MSJOIN的原因是由于它认为MSJOIN可以得到更快的速度,但是实际上由于TIM产品,用户不得不手工调整的cardinality统计数值迷惑了optimizer,在用户最后一次运行runstats后,尽管其他部分的统计信息改变了不到1%,但是优化器经过计算还是认为MSJOIN更加优秀导致的问题。

那么怎么办?

在fixpak 13中,我们向db2set注册项的DB2_REDUCED_OPTIMIZATION中添加了CAP ON选项,如果用户使用了该选项,优化器在计算MSJOIN的cost时会改变一些算法而相对高估其cost。这样一来优化器就不可能使用MSJOIN了。

于是让客户升级到fixpak13,打开该选项,启动数据库,果然得到好的访问计划。

[[i] 本帖最后由 wangzhonnew 于 2007-12-20 05:14 编辑 [/i]]
论坛徽章:
18
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52
2#
发表于 2007-12-20 05:34 | 只看该作者
xx说:三人行,必有我师。

使用道具 举报

回复
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010广州亚运会纪念徽章:橄榄球
日期:2011-05-22 10:54:33管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:012010年世界杯参赛球队:丹麦
日期:2010-04-06 10:23:36
3#
发表于 2007-12-20 07:26 | 只看该作者
最近碰到过类似的case,也是降低优化级别解决,给大家一个优化级别的说明
Use greedy join enumeration
• Optimization Class 0
- Minimal optimization for OLTP
- Use index scan/nested loop join
- Avoid some query rewrite
• Optimization Class 1
- Low optimization
- Rough approximation of Version 1
• Optimization Class 2
- Full optimization, limit space/time
- Use same query transformation and join strategies as Class 7
Use dynamic programming join enumeration
• Optimization Class 3
- Moderate optimization
- Rough approximation of DB2 for MVS/ESA
• Optimization Class 5
- Self-adjusting full optimization (default)
- Uses all techniques with heuristics
• Optimization Class 7
- Similar to 5, without heuristics
• Optimization Class 9
- Maximal optimization
- Spare no effort/expense
- Consider all possible join orders, including Cartesian products.

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
4#
发表于 2007-12-20 09:55 | 只看该作者
我这几天也遇到优化器得到的cost而相对高的情况!问题已经解决,改天也发一贴!

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
5#
发表于 2007-12-20 09:56 | 只看该作者
感觉DB2的优化器算法很难琢磨阿!很有可能对于每一个优化级别的执行路径都不一样!

没有文档,资料不公开!!

[ 本帖最后由 myfriend2010 于 2007-12-20 09:57 编辑 ]

使用道具 举报

回复
论坛徽章:
233
天枰座
日期:2016-02-02 09:36:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-06-22 19:28:30现任管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-04-08 16:56:552011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
6#
发表于 2007-12-20 10:14 | 只看该作者
cap on是内部参数?

使用道具 举报

回复
论坛徽章:
42
ITPUB元老
日期:2005-09-09 13:45:35马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14优秀写手
日期:2013-12-18 09:29:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32版主3段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:36
7#
发表于 2007-12-20 12:39 | 只看该作者
是这样的,前几个月做了一个优化的项目,感觉也对Db2 优化器策略不是很理解

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2006-06-15 15:15:15会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44铁扇公主
日期:2007-10-26 16:08:48生肖徽章2007版:鼠
日期:2008-01-02 17:35:532008新春纪念徽章
日期:2008-02-13 12:43:03奥运会纪念徽章:田径
日期:2008-08-19 09:59:402010广州亚运会纪念徽章:高尔夫球
日期:2010-11-22 15:29:49优秀写手
日期:2014-02-28 06:00:13
8#
发表于 2007-12-20 13:39 | 只看该作者
都把大家经验share出来看看

使用道具 举报

回复
论坛徽章:
0
9#
发表于 2007-12-20 14:25 | 只看该作者
刚学db2,优化都是手工处理的。汗!

使用道具 举报

回复
论坛徽章:
42
ITPUB元老
日期:2005-09-09 13:45:35马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14优秀写手
日期:2013-12-18 09:29:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32版主3段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:36
10#
发表于 2007-12-21 20:32 | 只看该作者
原帖由 macrozeng 于 2007-12-20 12:39 发表
是这样的,前几个月做了一个优化的项目,感觉也对Db2 优化器策略不是很理解


上次也是在 v8.2  做 runstat 以后,某条执行速度变慢,但是忘记是否在 V9.1 上是否也一样,不知道  V9.1 是否也向 DB2_REDUCED_OPTIMIZATION中添加了CAP ON选项。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表