2016-11-30 10 views
0

は、私はそうのようなインデックスを作成する2000万行を持つテーブルがあると言う:インデックスが部分的に作成されていると、パフォーマンス/インデックスサイズが目立つようになりますか?

CREATE INDEX fruit_color 
    ON fruits 
    USING btree 
    (color); 

今度は、果実のわずか2%が色を持っていることを、残りはNULLになりましょう。

CREATE INDEX fruit_color 
    ON fruits 
    USING btree 
    (color) 
    WHERE color IS NOT NULL; 

私はあまり知らない:私は、インデックスを変更した場合、それはPostgreSQLの違いを生むだろう、私のクエリは、NULL(色なし)と果物を見つけたい決してますので、疑問がありますpostgresqlのインデックスの内部処理方法については、これが私が尋ねる理由です。

PS postgresqlバージョンは9.2

+0

私の推測では、BTreeの色の部分はどちらの場合も同じように見えるので、インデックスのパフォーマンスはそれほど変わらないでしょう。インデックスのサイズは異なる場合があります。実際に両方のインデックスを 'EXPLAIN'と一緒に使ってみましたか? –

答えて

0

はい、それは違いがあります。どのくらいの違いがインデックスの使用方法に依存するか。

特定の色の果物が1つしかなく、この果物を色で検索すると、それほど大きな違いはありません。 1つのページがアクセスされる可能性があります(索引の深さが1レベル低い可能性があるため)。

特定の色の果物が多い場合は、全体のインデックス(ビットマップインデックススキャンの場合)またはそれより大きな部分(通常またはインデックスの場合)をスキャンする方がはるかに安くなるため、単なるスキャン)。 インデックスが大きい場合、PostgreSQLは完全なインデックスをスキャンしたくないので、おそらく順次テーブルスキャンを選択します。

+0

私は2つのインデックスを実装しましたが、インデックスのサイズも非常に異なっているとも言えます。部分的なものはかなり小さかった! –

関連する問題