最近發(fā)現(xiàn)了一個(gè)Oracle索引的小細(xì)節(jié)。
如果索引是建立在多個(gè)列上, 只有在它的第一個(gè)列(leading column)被where子句引用時(shí),優(yōu)化器才會(huì)選擇使用該索引。
這也是一條簡(jiǎn)單而重要的規(guī)則。見以下實(shí)例。
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)
(只使用索引的第一個(gè)字段查詢,可以利用索引)
SQL> select * from multiindexusage where indb = 1;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'
(只使用索引的第二個(gè)字段查詢,將不會(huì)利用索引)
很明顯, 當(dāng)僅引用索引的第二個(gè)列時(shí),優(yōu)化器使用了全表掃描而忽略了索引。