期待どおりに動作します。オラクルは、あなたが求めたことを正確に実行しました。
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
phonenumber, email
に複合インデックスがあります 、フィルタ述語のどの列も使用していませんが クエリの:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
したがって、Oracleがインデックススキャンを実行する理由はありません phonenumber, email
。複合キーの列をフィルタリングするのではなく、単に選択しているだけです:
SELECT Phonenumber, email
from student left join Xyz
インデックス プロジェクトのときに使用されます SELECT だけでなく、これらの列 。 STUDENT
予想どおり、テーブルはFULL TABLE SCAN
になります これは単純な選択であり、インデックス付きの列にフィルターを使用しないためです。インデックススキャンが行われていることを確認したい場合は、以下のフィルターを追加してください:
AND phonenumber = <value>
AND email = <value>