临时表不能利用索引的研究

前言:Oracle临时表能避免并发,提高程序的可伸缩性等诸多优点,但在查询时,有时不能有效利用索引

问题描述:有如下两张表,其中yd_yhjbda是普通表,有记录数10万条,TMP_JSHH_X为Oracle基于会话的

临时表,有一条记录:
表TMP_JSHH_X
CREATE GLOBAL TEMPORARY TABLE TMP_JSHH_X
(
  HH    NUMBER(8),
  DFNY  VARCHAR2(6),
  SFPC  NUMBER(2)
)
ON COMMIT PRESERVE ROWS;

CREATE TABLE YD_YHJBDA
(
  HH       NUMBER(8)                            NOT NULL,
  HM       VARCHAR2(100),
  YDDZ     VARCHAR2(50),
  SFZH     VARCHAR2(18)
);

CREATE UNIQUE INDEX YD_YHJBDA_PK ON YD_YHJBDA
(HH);

(1)进行如下关联查询
select a.hh,a.hm,a.YDDZ,a.sfzh
from tmp_jshh_x b,yd_yhjbda a
where a.hh=b.hh

执行计划
Operation        Object Name        Rows        Bytes        Cost        Object Node        In/Out        PStart       

PStop

SELECT STATEMENT Optimizer Mode=CHOOSE                7 M                 4677                                     

                
  HASH JOIN                7 M        373 M        4677                                                      
    TABLE ACCESS FULL        TMP_JSHH_X        8 K        103 K        10                                             

        
    TABLE ACCESS FULL        YD_YHJBDA        94 K        3 M        3624                                             

        
发现没有利用索引

(2)改用如下查询(查询字段减少):
select a.hh
from tmp_jshh_x b,yd_yhjbda a
where a.hh=b.hh
或:
select b.*
from tmp_jshh_x b,yd_yhjbda a
where a.hh=b.hh

执行计划:
Operation        Object Name        Rows        Bytes        Cost        Object Node        In/Out        PStart       

PStop

SELECT STATEMENT Optimizer Mode=CHOOSE                7 M                 10                                     

                
  NESTED LOOPS                7 M        131 M        10                                                      
    TABLE ACCESS FULL        TMP_JSHH_X        8 K        103 K        10                                             

        
    INDEX UNIQUE SCAN        YD_YHJBDA_PK        94 K        459 K                                                    

        
发现成功利用了YD_YHJBDA_PK索引

(3)改写查询,利用hint
select /*+ ORDERED use_nl(a)*/a.hh,a.hm,a.yddz,a.sfzh
from tmp_jshh_x b,yd_yhjbda a
where a.hh=b.hh

执行计划
Operation        Object Name        Rows        Bytes        Cost        Object Node        In/Out        PStart       

PStop

SELECT STATEMENT Optimizer Mode=CHOOSE                7 M                 8178                                     

                
  NESTED LOOPS                7 M        373 M        8178                                                      
    TABLE ACCESS FULL        TMP_JSHH_X        8 K        103 K        10                                             

        
    TABLE ACCESS BY INDEX ROWID        YD_YHJBDA        94 K        3 M        1                                     

                
      INDEX UNIQUE SCAN        YD_YHJBDA_PK        94 K                                                             

        
发现成功利用索引

后来把TMP_JSHH_X改成普通表能够正确使用索引YD_YHJBDA_PK。

总结:在使用Oracle临时表时有时不能使用索引,可能是和临时表的特性有关系,不能收集统计数据,执

行计划不是最优,此时需要注意使用hint。

【转自bbs.bitsCN.com】

本文网址:http://bbs.bitscn.com/69514

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13999636/viewspace-663273/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13999636/viewspace-663273/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值