
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: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论坛