3 つのフィールドを持つ postgres テーブルがあります。
- a : postgis ジオメトリ
- b : 配列 varchar[]
- c : 整数
そして、それらすべてを含むクエリがあります。高速化するために複数列のインデックスを追加したいのですが、その性質上、3 つのフィールドを同じインデックスの下に置くことができないため、できません。
この場合の戦略は何ですか?3つのインデックスgist、gin、btree、およびpostgresを追加すると、クエリ中にそれらすべてが使用されますか?
3 つのフィールドを持つ postgres テーブルがあります。
そして、それらすべてを含むクエリがあります。高速化するために複数列のインデックスを追加したいのですが、その性質上、3 つのフィールドを同じインデックスの下に置くことができないため、できません。
この場合の戦略は何ですか?3つのインデックスgist、gin、btree、およびpostgresを追加すると、クエリ中にそれらすべてが使用されますか?
Postgres は、ビットマップ インデックス スキャンを使用して、1 つのクエリで複数のインデックスを非常に効率的に組み合わせることができます。ほとんどの場合、最も選択的なインデックスが選択され (またはビットマップ インデックス スキャンと組み合わせて 2 つ)、残りがフィルター処理されます。結果セットが十分に狭くなると、それ以上のインデックスをスキャンするのは効率的ではありません。
完全に一致するmulticolumn indexを持つ方がさらに高速ですが、桁違いではありません。配列型
を含めたいので、 GINインデックスを使用することをお勧めします。私の知る限り、配列型の汎用GiSTインデックスには演算子クラスがありません。(配列の場合は例外です。)intarray
integer
列を含めるには、まず必要な GIN 演算子クラスを提供するinteger
追加モジュールをインストールします。データベースごとに 1 回btree_gin
実行:
CREATE EXTENSION btree_gin;
次に、複数列のインデックスを作成できるはずです。
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
インデックス列の順序は、GIN インデックスには関係ありません。マニュアル:
複数列 GIN インデックスは、インデックスの列の任意のサブセットを含むクエリ条件で使用できます。B-tree や GiST とは異なり、クエリ条件が使用するインデックス列に関係なく、インデックス検索の有効性は同じです。
PostGisgeometry
タイプを含めているため、 GiSTインデックスが必要な最近傍検索を実行する可能性があります。この場合、2 つのインデックスを提案します。
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c); -- geometry type
CREATE INDEX tbl_bc_gin_idx ON tbl USING GIN(b, c);
どちらかまたは両方にinteger
列を追加できます。c
場合によります。そのためには、それぞれどちらbtree_gin
かbtree_gist
または両方が必要です。
その性質上、3 つのフィールドを同じインデックスの下に置くことはできません。
そうそう、できます。