Казвате, че CAMPO47 е силно селективен. Но вие филтрирате само по IS NOT NULL. Така че няма значение колко отделни стойности има, оптимизаторът няма да го използва като входна точка.
И колко селективен е? Както можете да видите от мощностите в плана за обяснение, избирането на STATO='SC' намира 12856 реда във вашата таблица. 12702 от тези редове очевидно имат CAMPO47 със стойност, така че само 154 реда са филтрирани от теста за невалидност. Ако оптимизаторът беше увеличил индекса на CAMPO47, колко реда щеше да върне? Вероятно много повече.
Оптимизаторът може да използва само един индекс на купчина за достъп до редове в таблица. (Механизмът е различен за растерните индекси, когато те прилагат звездна трансформация). Така че, ако смятате, че допълнителните достъпи до таблици са непоносимо бреме, тогава имате една възможност:съставен индекс. Ако STATO е наистина неселективен (сравнително малко редове), тогава вероятно сте в безопасност да замените съществуващия индекс с такъв (STATO, CAMPO47).
Има стар трик за подтикване на базата данни към използване на индекс за достъп до операции IS NOT NULL и това е да се използва операнд, който може да бъде верен само когато колоната съдържа стойност. Например, нещо подобно за колони с низове (предполагам, че нещо, наречено CAMPO47, просто трябва да бъде низ):
AND campo47 >= chr(0)
Това ще съответства на всяка колона, която съдържа един или повече ASCII символа. Не съм сигурен дали ще доведе до оптимизацията с „два индекса“, която описвате, но си струва да опитате. (Бих тествал това сам, но в момента нямам достъп до база данни на Oracle, а SQL Fiddle прескочи, когато се опитах да разгледам плана за обяснение)