Nó hoạt động như mong đợi. Oracle đã làm chính xác những gì bạn yêu cầu.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Bạn có một chỉ mục tổng hợp trên phonenumber, email
, trong khi bạn không sử dụng bất kỳ cột nào trong vị từ bộ lọc truy vấn của bạn:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Vì vậy, không có lý do gì khiến Oracle thực hiện quét chỉ mục trên phonenumber, email
. Bạn chỉ cần CHỌN các cột đó của khóa tổng hợp chứ không phải lọc chúng:
SELECT Phonenumber, email
from student left join Xyz
Chỉ mục sẽ được sử dụng khi bạn DỰ ÁN các cột đó, không chỉ CHỌN . STUDENT
bảng như mong đợi dành cho FULL TABLE SCAN
vì nó là một lựa chọn đơn giản và không sử dụng bất kỳ bộ lọc nào trên các cột được lập chỉ mục. Nếu bạn muốn xem quá trình quét chỉ mục đang diễn ra, hãy thêm bộ lọc bên dưới:
AND phonenumber = <value>
AND email = <value>