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」が使用されます。問題は、場所の列に基づいて計算されるインデックス式が使用されない理由です。