Oracle索引,真的用上了么?

Oracle索引,真的用上了么?

最近发现了一个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'

(只使用索引的第二个字段查询,将不会利用索引)

很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。



你可能感兴趣的:(Oracle索引,真的用上了么?)