आप कहते हैं कि CAMPO47 अत्यधिक चयनात्मक है। लेकिन आप केवल IS NOT NULL पर फ़िल्टर कर रहे हैं। तो इससे कोई फर्क नहीं पड़ता कि उसके पास कितने विशिष्ट मूल्य हैं, अनुकूलक इसे प्रवेश बिंदु के रूप में उपयोग नहीं करेगा।
और यह कितना चयनात्मक है? जैसा कि आप व्याख्या योजना में कार्डिनैलिटी से देख सकते हैं, STATO='SC' पर चयन करने से आपकी तालिका में 12856 पंक्तियाँ मिलती हैं। उन पंक्तियों में से 12702 में स्पष्ट रूप से एक मूल्य के साथ CAMPO47 है, इसलिए केवल 154 पंक्तियों को शून्यता के परीक्षण द्वारा फ़िल्टर किया जाता है। यदि अनुकूलक ने CAMPO47 पर सूचकांक के लिए प्लम्प किया होता तो कितनी पंक्तियाँ वापस आतीं? शायद और भी बहुत कुछ।
ऑप्टिमाइज़र टेबल पर पंक्तियों तक पहुँचने के लिए केवल एक हीप इंडेक्स का उपयोग कर सकता है। (जब वे स्टार ट्रांसफॉर्मेशन लागू कर रहे हों तो बिटमैप इंडेक्स के लिए तंत्र अलग होता है)। इसलिए, यदि आपको लगता है कि अतिरिक्त टेबल एक्सेस एक असहनीय बोझ है तो आपके पास एक विकल्प है:एक कंपाउंड इंडेक्स। यदि STATO वास्तव में अचयनित है (अपेक्षाकृत कुछ पंक्तियाँ) तो आप मौजूदा इंडेक्स को एक ऑन (STATO, CAMPO47) से बदलने में शायद सुरक्षित हैं।
IS NOT NULL ऑपरेशंस तक पहुंचने के लिए इंडेक्स का उपयोग करने में डेटाबेस को घुमाने के लिए एक पुरानी चाल है, और वह एक ऑपरेंड का उपयोग करना है जो केवल तभी सच हो सकता है जब कॉलम में कोई मान हो। उदाहरण के लिए, स्ट्रिंग कॉलम के लिए ऐसा कुछ (मैं CAMPO47 नाम की कोई चीज़ मान रहा हूँ बस एक स्ट्रिंग होना चाहिए):
AND campo47 >= chr(0)
यह किसी भी कॉलम से मेल खाएगा जिसमें एक या अधिक एसीआई वर्ण हों। सुनिश्चित नहीं है कि यह आपके द्वारा वर्णित "दो अनुक्रमणिका" अनुकूलन की ओर ले जाएगा, लेकिन यह एक शॉट के लायक है। (मैं स्वयं इसका परीक्षण करूंगा लेकिन अभी मेरे पास Oracle डेटाबेस तक पहुंच नहीं है, और जब मैंने एक्सप्लेन प्लान को देखने की कोशिश की तो SQL Fiddle ने बाधा डाली)