クエリ 1 では、id がインデックス付きの列であるにもかかわらず、フル テーブル スキャンが実行されています。クエリ 2 は同じ結果を達成しますが、はるかに高速です。クエリ 1 を実行してインデックス付きの列を返す場合、クエリはすぐに返されますが、インデックスのない列が返されるか、行全体が返される場合は、クエリに時間がかかります。
クエリ 3 では高速に実行されますが、列 'code' は NUMBER(12) ではなく VARCHAR2(10) であり、'id' と同じ方法でインデックスが作成されます。
クエリ 1 がインデックスを使用する必要があることを認識しないのはなぜですか? インデックス付きの数値列をより速く実行できるようにするために変更する必要があるものはありますか?
【クエリ1】
select a1.*
from people a1
where a1.id like '119%'
and rownum < 5
Explain Plan
SELECT STATEMENT ALL_ROWS
コスト: 67 バイト: 2,592 カーディナリティ: 4
2 COUNT STOPKEY
1 TABLE ACCESS FULL TABLE people
コスト: 67 バイト: 3,240 カーディナリティ: 5
【クエリ2】
select a1.*
from people a1, people a2
where a1.id = a2.id
and a2.id like '119%'
and rownum < 5
Explain Plan
SELECT STATEMENT ALL_ROWS
コスト: 11 バイト: 2,620 カーディナリティ: 4
5 COUNT STOPKEY
4 TABLE ACCESS BY INDEX ROWID TABLE people
コスト: 3 バイト: 648 カーディナリティ: 1
3 NESTED LOOPS
コスト: 11 バイト: 2,620 カーディナリティ: 4
1 INDEX FAST FULL SCAN INDEX people_IDX3
コスト: 2 バイト: 54,796 カーディナリティ: 7,828
2 INDEX RANGE SCAN INDEX people_IDX3
コスト: 2 カーディナリティ: 1
【クエリ3】
select a1.*
from people a1
where a1.code like '119%'
and rownum < 5
Explain Plan
SELECT STATEMENT ALL_ROWS
コスト: 6 バイト: 1,296 カーディナリティ: 2
3 COUNT STOPKEY
2 TABLE ACCESS BY INDEX ROWID TABLE people
コスト: 6 バイト: 1,296 カーディナリティ: 2
1 INDEX RANGE SCAN INDEX people_IDX4
コスト: 3 カーディナリティ: 2