CAMPO47は選抜力が高いとおっしゃいましたね。ただし、IS NOT NULL でのみフィルタリングしています。そのため、個別の値がいくつあっても問題ありません。オプティマイザはそれをエントリ ポイントとして使用しません。
そして、それはどのように選択的ですか?説明計画のカーディナリティからわかるように、STATO='SC' を選択すると、テーブルに 12856 行が見つかります。これらの行のうち 12702 行には明らかに値を持つ CAMPO47 が含まれているため、154 行のみが null のテストによって除外されます。オプティマイザーが CAMPO47 のインデックスを抽出した場合、何行が返されるでしょうか? おそらくもっとたくさん。
オプティマイザーは、1 つのヒープ インデックスのみを使用して、テーブルの行にアクセスできます。(ビットマップ索引がスター型変換を適用している場合、メカニズムは異なります)。したがって、追加のテーブル アクセスが耐え難い負担であると思われる場合は、1 つのオプションがあります。複合インデックスです。STATO が真に非選択的 (比較的少ない行) である場合、おそらく既存のインデックスを (STATO、CAMPO47) のインデックスに置き換えても安全です。
IS NOT NULL 操作にアクセスするためにインデックスを使用するようにデータベースを微調整するための古いトリックがあります。それは、列に値が含まれている場合にのみ true になるオペランドを使用することです。たとえば、文字列列の場合は次のようになります (CAMPO47 と呼ばれるものは文字列である必要があると想定しています)。
AND campo47 >= chr(0)
これは、1 つ以上の ASCII 文字を含む任意の列に一致します。あなたが説明した「2つのインデックス」の最適化につながるかどうかはわかりませんが、試してみる価値があります。(私はこれを自分でテストしますが、現在Oracleデータベースにアクセスできません.Explain Planを見ようとするとSQL Fiddleが投げつけられました)