查看: 2998|回复: 10

关于优化sql 为何不走index?

[复制链接]
论坛徽章:
26
授权会员
日期:2007-06-27 09:39:552010新春纪念徽章
日期:2010-03-01 11:08:242010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232010年世界杯参赛球队:斯洛伐克
日期:2010-05-25 13:42:01ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-29 16:22:53ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:22奥运会纪念徽章:跆拳道
日期:2012-07-04 11:25:40
发表于 2011-12-28 16:22 | 显示全部楼层 |阅读模式
本帖最后由 lixiang114 于 2011-12-28 17:07 编辑

oracle 9206

sql语句:

system@CHINA111> select pt.productid,
  2         (pt.productname1 || pt.productname2) name,
  3         et1_prod.pkrp_comm.wf_get_domaindata('StyleValue', y.stylecode) style,
  4         et1_prod.pkrp_comm.wf_get_domaindata('ColorValue', y.colourcode) color,
  5         (select count(p.quantity) from et1_prod.toaf_orderedproduct p where p.productid=y.productid and p.stylecode=y.stylecode and p.colourcode=y.colourcode and p.orderstatus=1000) quantity0,
  6         (select count(p.quantity) from et1_prod.toaf_orderedproduct p where p.productid=y.productid and p.stylecode=y.stylecode and p.colourcode=y.colourcode and p.orderstatus=1001) quantity1,
  7         (select count(p.quantity) from et1_prod.toaf_orderedproduct p where p.productid=y.productid and p.stylecode=y.stylecode and p.colourcode=y.colourcode and p.orderstatus=1002) quantity2,
  8         y.normalquantity,
  9         sl.Forsale
10    from
11         et1_prod.tscm_product pt,
12         et1_prod.tvws_productqty y,
13         et1_prod.Tscm_Productcolourstyle sl
14   where
15    pt.productid = y.productid
16    and y.productid=sl.productid
17    and y.stylecode=sl.stylecode
18    and y.colourcode=sl.colourcode;





执行计划:

执行计划
----------------------------------------------------------
          0 SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=1 Bytes=71)

          1                  0  SORT (AGGREGATE)

          2                  1    TABLE ACCESS (BY INDEX ROWID) OF 'TOAF_ORDEREDPRODUCT' (Cost=18 Card=53 Bytes=901)

          3                  2      INDEX (RANGE SCAN) OF 'I_COLOURCODE' (NON-UNIQUE) (Cost=1 Card=19766)

          4                  0  SORT (AGGREGATE)

          5                  4    TABLE ACCESS (BY INDEX ROWID) OF 'TOAF_ORDEREDPRODUCT' (Cost=18 Card=53 Bytes=901)

          6                  5      INDEX (RANGE SCAN) OF 'I_COLOURCODE' (NON-UNIQUE) (Cost=1 Card=19766)

          7                  0  SORT (AGGREGATE)

          8                  7    TABLE ACCESS (BY INDEX ROWID) OF 'TOAF_ORDEREDPRODUCT' (Cost=18 Card=53 Bytes=901)

          9                  8      INDEX (RANGE SCAN) OF 'I_COLOURCODE' (NON-UNIQUE) (Cost=1 Card=19766)

         10                  0  TABLE ACCESS (BY INDEX ROWID) OF 'TSCM_PRODUCT' (Cost=2 Card=1 Bytes=37)

         11                 10    NESTED LOOPS (Cost=16 Card=1 Bytes=71)

         12                 11      HASH JOIN (Cost=14 Card=1 Bytes=34)

         13                 12        TABLE ACCESS (FULL) OF 'TVWS_PRODUCTQTY' (Cost=6 Card=4212 Bytes=67392)

         14                 12       TABLE ACCESS (FULL) OF 'TSCM_PRODUCTCOLOURSTYLE' (Cost=6 Card=4160 Bytes=74880)

         15                 11      INDEX (RANGE SCAN) OF 'IDX_TSCM_PRODUCT_1' (NON-UNIQUE) (Cost=1 Card=1)



统计信息
----------------------------------------------------------
       8327  recursive calls
          0  db block gets
  184362743  consistent gets
         23  physical reads
        180  redo size
     170200  bytes sent via SQL*Net to client
       2183  bytes received via SQL*Net from client
        279  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       4160  rows processed

大量的consistent 读,关联字段都有索引,请教谢谢。




论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:跳水
日期:2012-06-13 13:46:02
发表于 2011-12-28 16:27 | 显示全部楼层
加个提示

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:53:542013年新春福章
日期:2013-02-25 14:51:24
发表于 2011-12-28 16:34 | 显示全部楼层
执行计划先格式话一下吧

使用道具 举报

回复
论坛徽章:
26
授权会员
日期:2007-06-27 09:39:552010新春纪念徽章
日期:2010-03-01 11:08:242010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232010年世界杯参赛球队:斯洛伐克
日期:2010-05-25 13:42:01ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-29 16:22:53ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:22奥运会纪念徽章:跆拳道
日期:2012-07-04 11:25:40
 楼主| 发表于 2011-12-28 16:44 | 显示全部楼层
谢谢,加过 /*+ RULE */ 效果明显,不过这些表刚做完分析,为啥cbo没有选择代价小的索引连接?

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2007-08-11 19:57:48ITPUB元老
日期:2007-09-08 16:22:27ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442012新春纪念徽章
日期:2012-01-04 11:49:54
发表于 2011-12-28 16:46 | 显示全部楼层
本帖最后由 lgtu 于 2011-12-28 17:19 编辑

这样写试试:
  1. SELECT PRODUCTID,
  2.        NAME,
  3.        STYLE,
  4.        COLOR,
  5.        SUBSTR(QUANTITY, 1, INSTR(QUANTITY, ',', 1, 1) - 1) QUANTITY0,
  6.        SUBSTR(QUANTITY,
  7.               INSTR(QUANTITY, ',', 1, 1) + 1,
  8.               INSTR(QUANTITY, ',', 1, 2) - INSTR(QUANTITY, ',', 1, 1) - 1) QUANTITY1,
  9.        SUBSTR(QUANTITY,
  10.               INSTR(QUANTITY, ',', 1, 2) + 1,
  11.               INSTR(QUANTITY, ',', 1, 3) - INSTR(QUANTITY, ',', 1, 2) - 1) QUANTITY2,
  12.        NORMALQUANTITY,
  13.        FORSALE
  14.   FROM (SELECT PT.PRODUCTID,
  15.                (PT.PRODUCTNAME1 || PT.PRODUCTNAME2) NAME,
  16.                ET1_PROD.PKRP_COMM.WF_GET_DOMAINDATA('StyleValue',
  17.                                                     Y.STYLECODE) STYLE,
  18.                ET1_PROD.PKRP_COMM.WF_GET_DOMAINDATA('ColorValue',
  19.                                                     Y.COLOURCODE) COLOR,
  20.                (SELECT NVL(SUM(DECODE(ORDERSTATUS, 1000, 1, 0)), 0) || ',' ||
  21.                        NVL(SUM(DECODE(ORDERSTATUS, 1001, 1, 0)), 0) || ',' ||
  22.                        NVL(SUM(DECODE(ORDERSTATUS, 1002, 1, 0)), 0) || ',' QUANTITY
  23.                   FROM ET1_PROD.TOAF_ORDEREDPRODUCT P
  24.                  WHERE P.PRODUCTID = Y.PRODUCTID
  25.                    AND P.STYLECODE = Y.STYLECODE
  26.                    AND P.COLOURCODE = Y.COLOURCODE
  27.                    AND P.ORDERSTATUS IN (1000, 1001, 1002)),
  28.                Y.NORMALQUANTITY,
  29.                SL.FORSALE
  30.           FROM ET1_PROD.TSCM_PRODUCT            PT,
  31.                ET1_PROD.TVWS_PRODUCTQTY         Y,
  32.                ET1_PROD.TSCM_PRODUCTCOLOURSTYLE SL
  33.          WHERE PT.PRODUCTID = Y.PRODUCTID
  34.            AND Y.PRODUCTID = SL.PRODUCTID
  35.            AND Y.STYLECODE = SL.STYLECODE
  36.            AND Y.COLOURCODE = SL.COLOURCODE);
复制代码


使用道具 举报

回复
论坛徽章:
289
蛋疼蛋
日期:2013-03-29 13:46:58优秀写手
日期:2013-12-24 06:00:12福特
日期:2014-02-17 17:30:59生肖徽章:兔
日期:2012-05-24 19:03:36SQL极客
日期:2013-12-09 14:13:35ITPUB季度 技术新星
日期:2014-02-24 11:00:06IT宝贝
日期:2014-08-27 10:32:17马上加薪
日期:2014-08-05 09:18:33SQL数据库编程大师
日期:2016-01-13 10:30:43玉石琵琶
日期:2014-03-04 16:46:07
发表于 2011-12-28 16:55 | 显示全部楼层
lixiang114 发表于 2011-12-28 16:44
谢谢,加过 /*+ RULE */ 效果明显,不过这些表刚做完分析,为啥cbo没有选择代价小的索引连接?

SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=1 Bytes=71)

使用道具 举报

回复
论坛徽章:
2
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:592012新春纪念徽章
日期:2012-01-04 11:58:18
发表于 2011-12-28 17:01 | 显示全部楼层
本帖最后由 turn999 于 2011-12-28 17:03 编辑

帮顶,期待高手解答

使用道具 举报

回复
论坛徽章:
26
授权会员
日期:2007-06-27 09:39:552010新春纪念徽章
日期:2010-03-01 11:08:242010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232010年世界杯参赛球队:斯洛伐克
日期:2010-05-25 13:42:01ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-29 16:22:53ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:22奥运会纪念徽章:跆拳道
日期:2012-07-04 11:25:40
 楼主| 发表于 2011-12-28 17:10 | 显示全部楼层
demonat 发表于 2011-12-28 16:55
SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=1 Bytes=71)

有问题吗?优化器是choose,我这些表和索引都已经分析过了,应该选择CBO方式

使用道具 举报

回复
论坛徽章:
51
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22铁扇公主
日期:2012-02-21 15:03:13最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-05-22 15:10:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:332013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36itpub13周年纪念徽章
日期:2014-09-28 10:55:55
发表于 2011-12-28 17:10 | 显示全部楼层
lixiang114 发表于 2011-12-28 16:44
谢谢,加过 /*+ RULE */ 效果明显,不过这些表刚做完分析,为啥cbo没有选择代价小的索引连接?

flush过吗?

使用道具 举报

回复
论坛徽章:
26
授权会员
日期:2007-06-27 09:39:552010新春纪念徽章
日期:2010-03-01 11:08:242010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232010年世界杯参赛球队:斯洛伐克
日期:2010-05-25 13:42:01ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-29 16:22:53ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:22奥运会纪念徽章:跆拳道
日期:2012-07-04 11:25:40
 楼主| 发表于 2011-12-28 17:16 | 显示全部楼层
本帖最后由 lixiang114 于 2011-12-28 17:16 编辑
iori809 发表于 2011-12-28 17:10
flush过吗?


木有,因为缓存区所存得执行计划还是分析之前数据生成的老执行计划??所以还要flush?

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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