最近发现了一个Oracle索引的小细节。
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引。
这也是一条简单而重要的规则。见以下实例。
SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));
Table created。
SQL> create index multindex on multiindexusage(inda,indb);
Index created。
SQL> set autotrace traceonly
SQL> select * from multiindexusage where inda = 1;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE'
2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)
(只使用索引的第一个字段查询,可以利用索引)
SQL> select * from multiindexusage where indb = 1;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'
(只使用索引的第二个字段查询,将不会利用索引)
很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。