ITPUB论坛 » Oracle开发 » 两表联合查询,如何利用索引!
新一届的微软MVP评选已经开始,欢迎各位推荐!
2008-7-2 16:36 lenozhi
两表联合查询,如何利用索引!

表结构如下:
t_goods_decl(decl_no,orgcode,valid,  ....)
t_goods_decl_msg(decl_no,status,valid, ....)

列出了主要字段,其他的暂时省去。两张表的关系是1对1,msg表存的是decl表的状态及附加信息。


查询语句:

SELECT COUNT(decl.decl_no)  
          FROM T_GOODS_DECL decl,   T_GOODS_DECL_MSG  msg
          WHERE (decl.VALID='1' )
                       AND(((msg.STATUS='1' OR msg.STATUS='2' )
                       AND decl.DECL_NO=msg.DECL_NO))

索引情况:
             1. 两张表的decl_no字段建立唯一索引
             2. msg表的status字段,及decl表的valid字段分建立位图索引

数据库情况:
             oracle 9i


执行计划:

SELECT STATEMENT Optimizer Mode=CHOOSE  1     3550                           
  SORT AGGREGATE  1   20                             
    HASH JOIN  47 K 926 K 3550                           
      TABLE ACCESS FULL CSUSR.T_GOODS_DECL 129 K 1 M 2661                           
      TABLE ACCESS FULL CSUSR.T_GOODS_DECL_MSG 200 K 1 M 595                           


问题:
   请大家帮我分析一下,如果解决该问题,我不知道联表查询时,索引怎么利用。

2008-7-2 21:23 cosio
SELECT COUNT(decl.decl_no)  
          FROM T_GOODS_DECL decl  LEFT OUTER JOIN  T_GOODS_DECL_MSG  msg  ON decl.DECL_NO=msg.DECL_NO
          WHERE (decl.VALID='1' ) AND  msg.STATUS IN('1','2')

采用连接写法,试试!

2008-7-2 21:26 lenozhi
联接的方法试后,有一张表可以走索引,另一张还是全表扫。DECL这张表是页面上分页显示用的,现在数据量50W,每次COUNT(*)就得花了10秒左右,很郁闷

2008-7-2 21:34 哈儿1号
学习

2008-7-2 21:43 Steven_1981
T_GOODS_DECL decl,   
          WHERE (decl.VALID='1' )
这个过滤后,数据量有多少?
你如果想要查询走索引,可以加HINT,但未必是走索引就快。
set autot trace
看看逻辑读有多少?

2008-7-2 21:45 Steven_1981
另外建议的索引:
GOODS_DECL(valid,decl_no)   
T_GOODS_DECL_MSG  (status,decl_no);

2008-7-6 08:11 xinyisky
学习了

页: [1]


Powered by ITPUB论坛