查看: 12560|回复: 15

烦人的"Recost for ORDER BY"

[复制链接]
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
发表于 2008-3-20 11:42 | 显示全部楼层 |阅读模式
起因是一个SQL走错了索引
SELECT ROWID AS rid
FROM tab_1 s
WHERE s.c_id = :1
ORDER BY s.gmt_r DESC

执行计划如下
------------------------------------------------------------------------------------------
| Id  | Operation                   |  Name                      | Rows  | Bytes | Cost  |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                            |   858 | 25740 |   138K|
|*  1 |  TABLE ACCESS BY INDEX ROWID| tab_1               |   858 | 25740 |   138K|
|*  2 |   INDEX FULL SCAN DESCENDING| tab_1_RPST_ST_IND  |   605K|       |  3408 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("S"."c_id"=TO_NUMBER(:Z))
CBO走了排序字段的索引, 而不是过滤度很高的c_id字段上的索引.

10053 Trace发现的东西
***************************************
SINGLE TABLE ACCESS PATH
Column: C_ID  Col#: 4      Table: tab_1   Alias:  S
    NDV: 1854      NULLS: 0         DENS: 1.4164e-03
    HEIGHT BALANCED HISTOGRAM: #BKT: 72 #VAL: 73
Column:     STATUS  Col#: 33     Table: tab_1   Alias:  S
    NDV: 4         NULLS: 0         DENS: 5.0201e-04
    FREQUENCY HISTOGRAM: #BKT: 996 #VAL: 4
  TABLE: tab_1     ORIG CDN: 657584  ROUNDED CDN: 858  CMPTD CDN: 858
  Access path: tsc  Resc:  1868  Resp:  1868
  Access path: index (scan)
      Index: tab_1_CID_ST_GE_IND
  TABLE: tab_1
      RSC_CPU: 0   RSC_IO: 122
  IX_SEL:  1.3048e-03  TB_SEL:  1.3048e-03
  Access path: index (no sta/stp keys)
      Index: tab_1_GID_CID_ST_IND
  TABLE: tab_1
      RSC_CPU: 0   RSC_IO: 3785
  IX_SEL:  1.0000e+00  TB_SEL:  1.3048e-03
  Access path: index (no sta/stp keys)
      Index: tab_1_RPST_ST_IND
  TABLE: tab_1
      RSC_CPU: 0   RSC_IO: 138323
  IX_SEL:  1.0000e+00  TB_SEL:  9.2118e-01
  BEST_CST: 122.00  PATH: 4  Degree:  1-------------------------CBO在计算了全表扫描和各个索引的扫描成本以后找到到了正确的索引, cost是122.
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tab_1 [ S]
ORDER BY sort
    SORT resource      Sort statistics
      Sort width:          119 Area size:      838656 Max Area size:    41943040   Degree: 1
      Blocks to Sort:        5 Row size:           43 Rows:        858
      Initial runs:          1 Merge passes:        1 IO Cost / pass:         17
      Total IO sort cost: 11------------------------------------------------------排序, cost为11
      Total CPU sort cost: 0
      Total Temp space used: 0
Best so far: TABLE#: 0  CST:        133  CDN:        858  BYTES:      25740
                                                       ↑---------------------------------------------------总cost为122+11=133
****** Recost for ORDER BY (using index) ************ --------------------成本重算, 噩梦的开始.
***************************************
SINGLE TABLE ACCESS PATH
  TABLE: tab_1     ORIG CDN: 657584  ROUNDED CDN: 858  CMPTD CDN: 858
  Access path: tsc  Resc:  1868  Resp:  1868
  Skip scan: ss-sel 1  andv 176430  
    ss cost 176430
    index io scan cost 3406
  Access path: index (no sta/stp keys)
      Index: tab_1_RPST_ST_IND
  TABLE: tab_1
      RSC_CPU: 0   RSC_IO: 138323
  IX_SEL:  1.0000e+00  TB_SEL:  9.2118e-01
  BEST_CST: 138323.00  PATH: 4  Degree:  1-----------------------CBO重新选择了排序字段所在的index, 尽管它的cost是13万.
***********************
Join order[1]: tab_1 [ S]
Best so far: TABLE#: 0  CST:     138323  CDN:        858  BYTES:      25740-------------best so far, 看到这几个字, 表示CBO停止了更多执行计划的尝试.
    SORT resource      Sort statistics
      Sort width:          119 Area size:      838656 Max Area size:    41943040   Degree: 1
      Blocks to Sort:        5 Row size:           43 Rows:        858
      Initial runs:          1 Merge passes:        1 IO Cost / pass:         17
      Total IO sort cost: 11
      Total CPU sort cost: 0
      Total Temp space used: 0
Final:-------------------------------------------------------------------------final, 最终选择了cost为13万的执行计划.  
CST: 138323  CDN: 858  RSC: 138323  RSP: 138323  BYTES: 25740
  IO-RSC: 138323  IO-RSP: 138323  CPU-RSC: 0  CPU-RSP: 0
  First Rows Plan
PLAN
Cost of plan:  138323
Operation...........Object name.....Options.........Id...Pid..
SELECT STATEMENT                                        0
TABLE ACCESS        tab_1    BY INDEX ROWID      1
INDEX               tab_1_RPFULL SCAN DESCEN    2    1

数据库版本是9.2.0.4, 我的问题是CBO为什么会在13万的cost和133的cost之间选择了前者.


[ 本帖最后由 mihawk 于 2008-10-20 14:52 编辑 ]
招聘 : 数据库管理员
论坛徽章:
8
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-26 14:29:27奥运会纪念徽章:射箭
日期:2008-07-18 13:01:38奥运会纪念徽章:羽毛球
日期:2008-10-24 14:08:29CTO参与奖
日期:2009-02-12 11:45:482013年新春福章
日期:2013-02-25 14:51:24
发表于 2008-3-20 11:55 | 显示全部楼层
是不是直方图的统计信息不对啊???

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
 楼主| 发表于 2008-3-20 11:58 | 显示全部楼层
原帖由 vogts 于 2008-3-20 11:55 发表
是不是直方图的统计信息不对啊???


直方图的统计信息是最新的, 而且基于直方图计算出来的cost是正确的, 符合实际情况的.

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2008-3-20 12:33 | 显示全部楼层
attention!

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
 楼主| 发表于 2008-3-20 14:14 | 显示全部楼层
metalink查了, 是oracle的bug, id是1306032.

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2008-3-20 14:44 | 显示全部楼层
have fixed this bug? which the patch?

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
 楼主| 发表于 2008-3-20 15:10 | 显示全部楼层
刚刚在高人的指点下, 把_SORT_ELIMINATION_COST_RATIO 设为 1 就可以解决问题了.

使用道具 举报

回复
认证徽章
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
发表于 2008-3-26 11:52 | 显示全部楼层
学习了

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
发表于 2008-3-28 15:21 | 显示全部楼层
学习

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
25
生肖徽章2007版:龙
日期:2008-05-06 11:07:48咸鸭蛋
日期:2011-10-19 10:09:12ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
发表于 2008-3-28 15:28 | 显示全部楼层
原帖由 mihawk 于 2008-3-20 14:14 发表
metalink查了, 是oracle的bug, id是1306032.

怎么触发这个bug的。

使用道具 举报

回复

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

本版积分规则 发表回复

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