SQL> select di.index_name,di.table_name,di.blevel,di.leaf_blocks,di.num_rows,di.last_analyzed from dba_indexes di
2where di.index_name='AR_RE_N1';
INDEX_NAME
TABLE_NAME
BLEVEL LEAF_BLOCKS NUM_ROWS LAST_ANALY
------------------------------ ------------------------------ ---------- ----------- ---------- ----------
AR_RE_N1
AR_RE
21754 787546 23-6月 -04
SQL> set autotrace traceonly explain
SQL> select *
2from AR_CA ac,AR_REAM
3where AM.CASH_ID=AC.CASH_ID;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=18299 Card=785750 By
tes=241225250)
10 HASH JOIN (Cost=18299 Card=785750 Bytes=241225250)
21 TABLE ACCESS (FULL) OF 'AR_CA' (Cost=239
Card=108350 Bytes=13652100)
31 TABLE ACCESS (FULL) OF 'AR_RE'
(Cost=2280 Card=796630 Bytes=144190030)
SQL>
SQL> analyze index ar.AR_RE_N1 delete statistics;
索引已分析
SQL> set autotrace traceonly explain;
--可以看到没用全表扫描了
SQL> select *
2from AR_CA ac,AR_REAM
3where AM.CASH_ID=AC.CASH_ID;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=4251 Card=785750 Byt
es=241225250)
10 MERGE JOIN (Cost=4251 Card=785750 Bytes=241225250)
21 TABLE ACCESS (BY INDEX ROWID) OF 'AR_RE'
(Cost=826 Card=796630 Bytes=144190030)
32 INDEX (FULL SCAN) OF 'AR_RE_N1' (
NON-UNIQUE) (Cost=26 Card=796630)
41 SORT (JOIN) (Cost=3186 Card=108350 Bytes=13652100)
54 TABLE ACCESS (FULL) OF 'AR_CA' (Cost=23
9 Card=108350 Bytes=13652100)
SQL> set autotrace off
SQL> analyze index ar.AR_RE_N1 estimate statistics;
索引已分析
--又是全表扫描了
SQL> select di.index_name,di.table_name,di.blevel,di.leaf_blocks,di.num_rows,di.last_analyzed from dba_indexes di
2where di.index_name='AR_RE_N1';
INDEX_NAME
TABLE_NAME
BLEVEL LEAF_BLOCKS NUM_ROWS LAST_ANALY
------------------------------ ------------------------------ ---------- ----------- ---------- ----------
AR_RE_N1
AR_RE
21754 787546 23-6月 -04
SQL> set autotrace traceonly explain;
SQL> select *
2from AR_CA ac,AR_REAM
3where AM.CASH_ID=AC.CASH_ID;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=18299 Card=785750 By
tes=241225250)
10 HASH JOIN (Cost=18299 Card=785750 Bytes=241225250)
21 TABLE ACCESS (FULL) OF 'AR_CA' (Cost=239
Card=108350 Bytes=13652100)
31 TABLE ACCESS (FULL) OF 'AR_RE'
(Cost=2280 Card=796630 Bytes=144190030)
--用hits也没用全表扫描
SQL> select /*+FIRST_ROWS*/*
2from AR_CA ac,AR_REAM
3where AM.CASH_ID=AC.CASH_ID;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=325289 Car
d=785750 Bytes=241225250)
10 NESTED LOOPS (Cost=325289 Card=785750 Bytes=241225250)
21 TABLE ACCESS (FULL) OF 'AR_CA' (Cost=239
Card=108350 Bytes=13652100)
31 TABLE ACCESS (BY INDEX ROWID) OF 'AR_RE'
(Cost=3 Card=796630 Bytes=144190030)
43 INDEX (RANGE SCAN) OF 'AR_RE_N1'
(NON-UNIQUE) (Cost=2 Card=796630)
SQL> select /*+RULE*/*
2from AR_CA ac,AR_REAM
3where AM.CASH_ID=AC.CASH_ID;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=HINT: RULE
10 NESTED LOOPS
21 TABLE ACCESS (FULL) OF 'AR_RE'
31 TABLE ACCESS (BY INDEX ROWID) OF 'AR_CA'
43 INDEX (UNIQUE SCAN) OF 'AR_CA_U1' (UNIQUE)
为什么做了索引统计分析,CBO反而不用索引呢?
但是在另外的两张表中我做了同样的工作,不论用什么方式(删掉统计信息,用hits等)均采用全表扫描,而采用索引查询。
搞不懂CBO到底怎么做的?请高手能解答一下,谢谢。
|