2016-11-01 18 views
0

私は2つのインデックスを持っている:PostgresQL - GINインデックスとBツリーとの交差?

SELECT * FROM table WHERE a = 'test' and b = 1 and c @> '{"test1", "test2"}'::text[]; 

問い合わせプランナを印刷このうち:私のクエリは次のようになり

CREATE INDEX table_a_b ON table (a, b); 
CREATE INDEX table_c_gin ON table USING GIN(c); 

Index Scan using table_a_b on table (cost=0.13..8.15 rows=1 width=52) 
Index Cond: (((a)::text = 'test'::text) AND (b = 1)) 
Filter: (c @> '{test1, test2}'::text[]) 

だから私は作ることができるどのような方法がありますジンインデックスの仕事も?おそらく、2つの異なるインデックスタイプを持つ複合インデックスを作成する方法がありますか?

ありがとうございました。

+1

ここには問題はありません。クエリプランナーは、 'a'と' b'のインデックスを使用して単一の行を返すことを期待しています。なぜもっと複雑な(と私はより高価な疑いのある)GINインデックスを使用するのだろうか?プランナーの見積もりはひどく間違っていますか?そうであれば、それを調べることになります。 – jpmc26

+0

@ jpmc26何も問題ありません。私は、この例ではインデックス交差点を使用できるかどうかを判断しようとしています。なぜなら、より高価な操作が列 'c'の配列をフィルタリングすることが疑わしいからです。 – nainy

+1

インデックスは、フィルタリングする行の数に基づいて選択されます。データベースが1つの索引が他の索引よりも多くの行を除外すると見積もった場合、その索引は1つの索引を優先します(表が完全スキャンを回避するのに十分な大きさであると仮定します)。それは "どちらがより高価ですか?"という質問ではありません。それは、どれが少ない行を返すのかという問題です。配列チェックで他の行より多くの行が除外されると思いますか?そのような場合は、それらのプロパティを持つデータを操作する必要があります。プランナーが価値があると見積もった場合、PGは2つの索引スキャンの結果を組み合わせる方法を実際に持っていることに注意してください。 – jpmc26

答えて

1

プランナーが行う価値があると考えるならば、table_a_bのビットマップインデックススキャンを使用して2つの結果を組み合わせることができます。あなたはそれをしない理由を理解するために、EXPLAINの出力を見なければならないでしょう。

結合インデックスを作成する場合は、btree_gin拡張子をインストールする必要があります。次に、GINインデックスにtextintegerの列を使用できます。

関連する問題