19

このトピックに関する以前の質問に続いて、複数のインデックスを組み合わせた Postgres :

Postgres 9.2(postgisを使用)に次の表があります:

CREATE TABLE updates (
    update_id character varying(50) NOT NULL,
    coords geography(Point,4326) NOT NULL,
    user_id character varying(50) NOT NULL,
    created_at timestamp without time zone NOT NULL
);

そして、テーブルで次のクエリを実行しています。

select * 
from updates 
where ST_DWithin(coords, ST_MakePoint(-126.4, 45.32)::geography, 30000) 
and user_id='3212312' 
order by created_at desc
limit 60

では、(coords + user_id)、GIST、または BTree にどのインデックスを使用すればよいでしょうか?

CREATE INDEX ix_coords_user_id ON updates USING GIST (coords, user_id);

また

CREATE INDEX ix_coords_user_id ON updates (coords, user_id);

BTree のパフォーマンスが GIST よりも優れていると読んでいましたが、postgis 地理フィールドを使用しているため、GIST を使用する必要がありますか??

4

1 に答える 1

17

通常の B ツリー インデックス (またはハッシュ インデックスですが、実際には使用しないでください) 以外のインデックス メソッドを使用する場合は、GiST を使用する必要があります。PostGIS インデックスには GiST が必要です。

B ツリー インデックスは=<、 、 、 、 、 、 、 、 、 、 、 <=、 、>>=<>BETWEENIN. ジオメトリ オブジェクト (ポイント、リージョンなど) に B ツリー インデックスを作成できますが、実際には等値にしか使用できません>。このようなオブジェクトでは一般に順序比較は意味がないからです。「含む」、「交差する」などのより複雑で一般的な比較をサポートするには、GiST インデックスが必要です。

btree_gist拡張機能を使用して、GiST の b-tree インデックス作成を有効にすることができます。通常の B ツリー インデックスよりもかなり低速ですが、GiST のみの型と、 などtextの通常の型の両方を含む複数列のインデックスを作成できます。integer


これらの状況では、Pg が作成したさまざまなインデックスとインデックスの組み合わせをどのように使用するかを調べるためにexplain analyze( explain.depesz.comが便利です) 使用する必要があります。複数列のインデックスでさまざまな列の順序を試して、2 つ以上の個別のインデックスがより効果的かどうかを確認してください。

この場合、複数列の GiST インデックスで最良の結果が得られると強く思いますが、インデックスとインデックス列の順序付けのさまざまな組み合わせを試して確認したいと思います。

于 2012-10-05T03:20:45.850 に答える