2012-04-04 3 views
3

Oracleは2つのインデックスを利用して、ROWIDでテーブルにアクセスせずにクエリ全体を解決できますか?Oracle:2つのインデックスを使用する利点を利用してください

SELECT 'Scarti letture GAS' tipo, campo47 pdf, COUNT (1) n 
    FROM out.CONSUMI_GEE_LC_T500_00 v 
    WHERE stato = 'SC' 
    AND stato is not null 
    AND campo47 is not null 
    GROUP BY 'Scarti letture GAS', campo47; 

フィールドcampo47をSTATOインデックスに追加するテストを行いました。パフォーマンスは1 '49' 'から0,6'に向上します。

statoの索引は選択的ではありません。 campo47のインデックス(フィールド47を意味する)は本当に選択的です。

enter image description here

enter image description here

enter image description here

答えて

7

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

どのように選択的ですか? Explainプランのカーディナリティからわかるように、STATO = 'SC'を選択すると、表の12856行が見つかります。明白な行の12702には値を持つCAMPO47があるため、無効のテストでは154行しか除外されません。オプティマイザがCAMPO47の索引を盛り上げていた場合、返された行数はいくつですか?おそらくもっとたくさん。

オプティマイザは、ヒープ・インデックスを1つだけ使用して、表の行にアクセスできます。 (スター・トランスフォーメーションを適用しているときは、ビットマップ索引のメカニズムが異なります)。したがって、追加のテーブルアクセスが負担にならないと考えるなら、複合インデックスを1つ選択することができます。 STATOが本当に非選択(比較的少数の行)であれば、既存の索引を(STATO、CAMPO47)の1に置き換えるのはおそらく安全です。アクセスにインデックスを使用してに、データベースをナッジの古いトリックがあり


はNULL操作されていない、そしてそれは、列に値が含まれている唯一の真の可能オペランドを使用することです。例えば、文字列の列(私はCAMPO47は単なる文字列であることをHASEと呼ばれるものを仮定している)ため、このような何か:

AND campo47 >= chr(0) 

一つ以上のASCII文字が含まれている任意の列にマッチします。あなたが説明する "2つのインデックス"最適化につながるかどうかは分かりませんが、それは価値があります。 (私はこれを自分でテストしますが、今はOracleデータベースにアクセスできないので、Explain Planを見てみるとSQL Fiddleが飛びます)

+0

どうすれば別の種類の挿入/選択パフォーマンスをテストできますかインデックス? STATOのインデックスを(STATO、CAMPO47)に置き換えたり、STATOとCampo47の両方のインデックスを削除したり、単にインデックス(STATO、CAMPO47)で置き換えたりすることができます。 – Revious

+0

私は、Oracleがstato = 'SC'ですべてのROWIDにアクセスし、次にROWIDで検索してテーブルにアクセスせずにresutlを直接返すcampo47のインデックスの高速フル・インデックス・スキャンを行うべきだと思います。 – Revious

+0

@APCあなたは私に 'admin at sqlfiddle dot com'というメールを送ってもいいですか、ここでリンクしてください。sqlfiddleの実行計画で見つかった問題の例ですか?ありがとう –

関連する問題