यह अपेक्षा के अनुरूप काम करता है। Oracle ने ठीक वही किया जो आपने उसे करने के लिए कहा था।
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
सूचकांक का उपयोग तब किया जाएगा जब आप प्रोजेक्ट वे कॉलम, न कि केवल चुनें . STUDENT
अपेक्षित रूप से तालिका एक FULL TABLE SCAN
के लिए जाती है क्योंकि यह एक सादा चयन है और अनुक्रमित कॉलम पर किसी भी फ़िल्टर का उपयोग नहीं करता है। यदि आप एक इंडेक्स स्कैन होते हुए देखना चाहते हैं, तो नीचे फ़िल्टर जोड़ें:
AND phonenumber = <value>
AND email = <value>