2012-07-01 3 views
5

私は交差したいテーブルが2つあります。最初の表は約5,000万点を表し、2番目の表は世界のすべての国のポリゴン層です。私はそのポリゴンと交差するすべての点を取得したい。Postgresql空間クエリーが遅すぎる

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を両方持っています。パフォーマンスはまだ向上しません。私はCENTOS 6をPostgres 8.4とPostGIS 1.5で動作させています。誰かが物事をスピードアップする方法についていくつかの光を当てることができますか? 1000から10000のレコードにクエリを制限すると、結果が非​​常に迅速に得られます。完全な結果セットを取得しようとすると、ドラッグされます。思考?

更新:このプロセスの最初のステップとしてクエリを絞り込む必要があることがわかりました。私はこのような封筒を手に入れます

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

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

+1

最近のリリースでは、GiSTインデックスとGINインデックスが改善されました。あなたは、新しいメジャーリリースへのアップグレードを検討したいかもしれません。 SP-GiSTが含まれているため、9.2ベータリリースで問題を試す価値があるかもしれません。 http://www.postgresql.org/docs/9.2/static/spgist-intro.html – kgrittn

答えて

1

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

実際の交差チェックは最も遅い操作であるため、サブクエリのST_Collect(ST_Intersectsチェック以外のすべて)に対して実行するのが役立ちます。そうすれば、呼び出しが1回しかなく、マルチジェノメーターの構築が十分速ければ、結果はより良いかもしれません。

EDIT1: さて、あなたは(もIDを保持する)3dに座標を強制しない限り、追加のルックアップは、ジオメトリ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 
+2

'LIMIT'で生成された計画は、' LIMIT'なしで必ずしも計画に似ているとは思わないでください。プランナは、すべての行を返すための最も安いプランではなく、要求された行数を返す最も安いプランを探しているので、同じかもしれませんが、全く異なる可能性があります。それらはしばしば異なる。 – kgrittn

+0

上記のSQL文のようなST_Collect()サブクエリの例を提供する可能性はありますか? – aeupinhere

+0

@ kgrittnもちろん、インデックスを使わないほうが安いだろうと私は非常に疑念があるので、私が言ったことの診断としてはうまくいくはずです。 – lynxlynxlynx