sql >> データベース >  >> RDS >> Oracle

Oracle:2つのインデックスを使用する

    あなたはCAMPO47が非常に選択的であると言います。ただし、フィルタリングはISNOTNULLのみです。したがって、個別の値がいくつあるかは関係ありません。オプティマイザはそれをエントリポイントとして使用しません。

    そしてそれはどれほど選択的ですか? Explain Planのカーディナリティからわかるように、STATO ='SC'を選択すると、テーブルに12856行が見つかります。明らかなこれらの行の12702には値を持つCAMPO47があるため、無効性のテストによって除外されるのは154行のみです。オプティマイザーがCAMPO47のインデックスに対応していたら、何行が返されますか?おそらくもっとたくさん。

    オプティマイザは、1つのヒープインデックスのみを使用してテーブルの行にアクセスできます。 (スター変換を適用しているビットマップインデックスのメカニズムは異なります)。したがって、追加のテーブルアクセスが耐え難い負担であると思われる場合は、複合インデックスという1つのオプションがあります。 STATOが本当に非選択的(比較的少数の行)である場合は、既存のインデックスを(STATO、CAMPO47)のインデックスに置き換えても安全です。

    IS NOT NULL操作にアクセスするためにインデックスを使用するようにデータベースを微調整するための古いトリックがあります。それは、列に値が含まれている場合にのみ真になることができるオペランドを使用することです。たとえば、文字列列の場合は次のようになります(CAMPO47と呼ばれるものは文字列である必要があると想定しています):

    AND campo47 >= chr(0)
    

    これは、1つ以上のASCII文字を含むすべての列に一致します。あなたが説明する「2つのインデックス」の最適化につながるかどうかはわかりませんが、一見の価値があります。 (私はこれを自分でテストしますが、現在Oracleデータベースにアクセスできず、ExplainPlanを見ようとしたときにSQLFiddleが急降下しました)




    1. SQLクエリ:テーブルから順序付けられた行をフェッチします-II

    2. oracle plsql:XMLを解析して表に挿入する方法

    3. サポートされていないキーワード:'server'

    4. ORACLE-JSONからキー値ペアテーブル