Říkáte, že CAMPO47 je vysoce selektivní. Ale vy pouze filtrujete na IS NOT NULL. Nezáleží tedy na tom, kolik různých hodnot má, optimalizátor je nepoužije jako vstupní bod.
A jak moc je to selektivní? Jak můžete vidět z mohutností v plánu vysvětlení, výběr na STATO='SC' najde 12856 řádků ve vaší tabulce. 12702 z těchto řádků zjevných má CAMPO47 s hodnotou, takže testem nulity je odfiltrováno pouze 154 řádků. Kolik řádků by se vrátilo, pokud by optimalizátor nabral index na CAMPO47? Pravděpodobně mnohem více.
Optimalizátor může pro přístup k řádkům v tabulce použít pouze jeden index haldy. (Mechanismus je odlišný pro bitmapové indexy, když aplikují hvězdicovou transformaci). Pokud si tedy myslíte, že další přístupy k tabulce jsou nesnesitelnou zátěží, máte jednu možnost:složený index. Pokud je STATO skutečně neselektivní (relativně málo řádků), pak pravděpodobně můžete nahradit stávající index jedním na (STATO, CAMPO47).
Existuje starý trik, jak pošťouchnout databázi k použití indexu pro přístup k operacím IS NOT NULL, a to použití operandu, který může být pravdivý pouze tam, kde sloupec obsahuje hodnotu. Například něco takového pro sloupce řetězců (předpokládám, že něco s názvem CAMPO47 prostě musí být řetězec):
AND campo47 >= chr(0)
To bude odpovídat libovolnému sloupci, který obsahuje jeden nebo více znaků ASCII. Nejste si jisti, zda to povede k optimalizaci „dvou indexů“, kterou popisujete, ale za pokus to stojí. (Sám bych to otestoval, ale momentálně nemám přístup k databázi Oracle a SQL Fiddle mrštil, když jsem se pokusil podívat na plán vysvětlení)