बस की सुविधा देता है कहते हैं कि तुम Oracle में एक मेज है:ओरेकल 10+ में एनयूएलएल वाले कॉलम पर फ़ंक्शन-आधारित इंडेक्स का उपयोग कैसे करें?
CREATE TABLE person (
id NUMBER PRIMARY KEY,
given_names VARCHAR2(50),
surname VARCHAR2(50)
);
इन समारोह आधारित सूचकांक के साथ
:
CREATE INDEX idx_person_upper_given_names ON person (UPPER(given_names));
CREATE INDEX idx_person_upper_last_name ON person (UPPER(last_name));
अब, given_names कोई शून्य मान हैं लेकिन तर्क की खातिर last_name करता है के लिए। मैं ऐसा करते हैं तो:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%'
यह नहीं है:
SELECT * FROM person WHERE UPPER(given_names) LIKE 'P%'
समझाने योजना मुझे अपने सूचकांक का उपयोग कर, लेकिन के लिए इसे बदल बताता है। ओरेकल दस्तावेज़ों का कहना है कि फ़ंक्शन-आधारित इंडेक्स का उपयोग करने के लिए केवल तभी उपयोग किया जाएगा जब कई स्थितियों को पूरा किया जाता है, जिनमें से एक यह सुनिश्चित कर रहा है कि कोई शून्य मान नहीं है क्योंकि उन्हें अनुक्रमित नहीं किया गया है।
मैं इन प्रश्नों की कोशिश की है:
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND UPPER(last_name) IS NOT NULL
और
SELECT * FROM person WHERE UPPER(last_name) LIKE 'P%' AND last_name IS NOT NULL
उत्तरार्द्ध मामले में मैं भी last_name पर एक सूचकांक जोड़ा है, लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करने की कोशिश यह एक पूर्ण तालिका स्कैन का उपयोग करता है। मान लीजिए कि मैं नल मानों से छुटकारा नहीं पा रहा हूं, मैं इस क्वेरी को UPPER (last_name) पर इंडेक्स का उपयोग करने के लिए कैसे प्राप्त करूं?
आपके पास वास्तव में तालिका में कितनी पंक्तियां हैं? क्या आप पूर्ण तालिका स्कैन के लिए समझाया गया योजना पोस्ट कर सकते हैं और जब भी यह इंडेक्स का उपयोग करना चुनता है (आपको इसे संकेत देना होगा या अभ्यास के उद्देश्यों के लिए कॉलम को न्यूल में बदलना होगा)। –