12

3 つのフィールドを持つ postgres テーブルがあります。

  • a : postgis ジオメトリ
  • b : 配列 varchar[]
  • c : 整数

そして、それらすべてを含むクエリがあります。高速化するために複数列のインデックスを追加したいのですが、その性質上、3 つのフィールドを同じインデックスの下に置くことができないため、できません。

この場合の戦略は何ですか?3つのインデックスgist、gin、btree、およびpostgresを追加すると、クエリ中にそれらすべてが使用されますか?

4

2 に答える 2

16

単一列インデックス

Postgres は、ビットマップ インデックス スキャンを使用して、1 つのクエリで複数のインデックスを非常に効率的に組み合わせることができます。ほとんどの場合、最も選択的なインデックスが選択され (またはビットマップ インデックス スキャンと組み合わせて 2 つ)、残りがフィルター処理されます。結果セットが十分に狭くなると、それ以上のインデックスをスキャンするのは効率的ではありません。

複数列のインデックス

完全に一致するmulticolumn indexを持つ方がさらに高速ですが、桁違いではありません。配列型
を含めたいので、 GINインデックスを使用することをお勧めします。私の知る限り、配列型の汎用GiSTインデックスには演算子クラスがありません。(配列の場合は例外です。)intarrayinteger

列を含めるには、まず必要な 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_ginbtree_gistまたは両方が必要です。

于 2014-03-26T23:37:02.913 に答える
2

その性質上、3 つのフィールドを同じインデックスの下に置くことはできません。

そうそう、できます。

于 2014-03-26T11:43:56.003 に答える