5

交差させたい2つのテーブルがあります。最初のテーブルは約 5,000 万ポイントを表し、2 番目のテーブルは世界のすべての国のポリゴン レイヤーです。そのポリゴンと交差するすべてのポイントを取得したい。

SELECT d.id, d.geom 
FROM export d, world_boundaries b 
WHERE (b.cntry_name = 'UK') 
  AND d.date_inserted >= '2012-06-01' 
  AND d.geom && b.wkb_geometry 
  AND intersects(d.geom, b.wkb_geometry);

このクエリは非常に単純ですが、実行に 4 時間以上かかります。各テーブルのジオメトリ列に GIST インデックスを作成し、両方を VACUUM ANALYZE しました。まだパフォーマンスの向上はありません。Postgres 8.4 および PostGIS 1.5 で CENTOS 6 を実行しています。物事をスピードアップする方法について誰かが光を当てることができますか? クエリを 1000 ~ 10000 レコードに制限すると、非常に迅速に結果が得られます。完全な結果セットを取得しようとすると、ドラッグされます。考え?

更新: このプロセスの最初のステップとして、クエリを絞り込む必要があることがわかりました。こんな感じで封筒が届きます

select astext(st_envelope(wkb_geometry)) as e 
from world_borders 
where cntry_name = 'UK'

さて、これをクエリ全体の一部として含める/実行する最も効率的な方法は何ですか?

4

1 に答える 1

1

EXPLAIN (および LIMIT) で実行して、インデックスがまったく使用されているかどうかを確認してください。

実際の交差チェックはそこで最も遅い操作であるため、おそらくサブクエリのST_Collect (ST_Intersects チェック以外のすべて) に対して実行すると役立つでしょう。そうすれば、呼び出しは 1 回だけになり、マルチジオメトリの構築が十分に高速であれば、最終的な結果はより良くなる可能性があります。

edit1: 座標を強制的に 3D にしない限り (ID も保持するため)、ジオメトリ ID を取得するために追加のルックアップが必要になるため、これはあまり最適ではないことがわかりました。

SELECT d.id, d.geom
FROM
(
    SELECT *
    FROM
    ( 
        SELECT ST_Collect(d.geom)
        FROM export d, world_boundaries b 
        WHERE (b.cntry_name = 'UK') 
        AND d.date_inserted >= '2012-06-01' 
        AND d.geom && b.wkb_geometry
    ) as c, world_boundaries b 
    WHERE (b.cntry_name = 'UK')
    AND ST_Intersection(c.geom, b.wkb_geometry);
) as e, export d
WHERE (ST_Dump(e.geom)).geom = d.geom
于 2012-07-01T21:58:19.410 に答える