4

postgresql がインデックスを使用する方法について質問があります。Postgis 対応データベースを使用した Postgresql の Geography Type 列に基づく Gist インデックス式に問題があります。

次の表があります。

CREATE TABLE place
(
  id serial NOT NULL,
  name character varying(40) NOT NULL,
  location geography(Point,4326),
  CONSTRAINT place_pkey PRIMARY KEY (id )
)

次に、列「場所」に基づいて Gist インデックス式を作成しました

CREATE INDEX place_buffer_5000m ON place
USING GIST (ST_BUFFER(location, 5000));

ここで、テーブル ルートに Linestring オブジェクトを含む柱状の形状があり、ラインが交差する 5000 m のポリゴン (場所の周囲) を確認したいとします。

私の意見では、以下のクエリは「place_buffer_5000m」インデックスを使用する必要がありますが、使用していません。

SELECT place.name
FROM place, route
WHERE
  route.id=1 AND
  ST_CROSSES(route.shape::geometry, ST_BUFFER(place.location, 5000)::geometry))

テーブルの場所には約 76000 行あります。「place_buffer_5000m」インデックスを再作成してこのテーブルで分析とバキュームが実行されましたが、上記のクエリではインデックスが使用されません。

「area_5000m」(地理タイプ) という名前のテーブルの場所に別の列を作成し、次のようにテーブルを更新すると、何が面白いでしょうか。

UPDATE place SET area_5000m=ST_BUFFER(location, 5000)

次に、この列の要点インデックスを次のように作成します。

CREATE INDEX place_area_5000m ON place USING GIST (area_5000m)

次に、クエリを使用します。

SELECT place.name
FROM place, route
WHERE
  route.id=1 AND
  ST_CROSSES(route.shape::geometry, place.area_5000m::geometry))

インデックス「place_area_5000m」が使用されます。問題は、場所の列に基づいて計算されるインデックス式が使用されない理由です。

4

2 に答える 2

1

「機能インデックス」にキャストを追加しようとしましたか? これは、データ型を判別するのに役立ちます。次のように、ジオメトリで動作し、おそらく地理でも動作するはずです。

CREATE INDEX place_buffer_5000m ON place
USING GIST(ST_BUFFER(location, 5000)::geometry);
于 2012-06-27T12:54:15.163 に答える
0

最終的には、場所から5 km以内にあるルートを知りたいのですが、これは非常に単純で一般的なタイプのクエリです。ただし、一般的なトラップに陥っています。ST_Bufferを使用してフィルタリングしないでください。高いです!

ST_DWithinを使用します。これは、通常のGiSTインデックス(使用可能な場合)を使用します。

SELECT place.name
FROM place, route
WHERE route.id = 1 AND ST_DWithin(route.shape::geography, place.location, 5000);
于 2012-06-28T07:02:22.350 に答える