SQL> set timing on
SQL> set autotrace traceonly
SQL> select count(*) from test where a='eygle' and b=1;
已用时间: 00: 00: 00.05
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=149 Card=1 Bytes=13)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=149 Card=5
Bytes=65)
3 2 INDEX (RANGE SCAN) OF 'I_BC' (NON-UNIQUE) (Cost=3 Card
=147)
Statistics
----------------------------------------------------------
354 recursive calls
0 db block gets
160 consistent gets
113 physical reads
0 redo size
376 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
11 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select count(*) from test where a='eygle.com' and b=1;
已用时间: 00: 00: 00.04
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=149 Card=1 Bytes=13)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=149 Card=1
42 Bytes=1846)
3 2 INDEX (RANGE SCAN) OF 'I_BC' (NON-UNIQUE) (Cost=3 Card
=147)
Statistics
----------------------------------------------------------
354 recursive calls
0 db block gets
160 consistent gets
113 physical reads
0 redo size
376 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
11 sorts (memory)
0 sorts (disk)
1 rows processed
我也遇到同样plan, 在metalink上是这样解释的,_b_tree_bitmap_plans is a hidden parameter in 920X with the default value set to TRUE and that is the reason, you see bitmap execution plan with B-Tree indexes.
看了一下:
这条SQL:select count(*) from test where a='eygle' and b=1;
走bitmap conversion 计划,所有工作都是通过索引完成的;
走INDEX (RANGE SCAN) OF 'I_BC' 计划,的话会有一个 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' 这步计算出的cost会比较高;
所以CBO选择了bitmap conversion 。
如果你用如下SQL:select * from test where a='eygle' and b=1;
就会走INDEX (RANGE SCAN) OF 'I_BC' 计划了。
我的测试:
SQL> select count(*) from test where a='eygle.com' and b=1;