PostGIS ST_Unionパフォーマンス


8

ST_Unionコマンドを使用してPostGISで「ディゾルブ」操作を実行しようとしています。

入力層は確かに非常に大きく複雑です。「大きい」とは、57,771のフィーチャを意味し、頂点の数はフィーチャあたり4〜758,018の範囲であり、平均してフィーチャあたり約86の頂点です。頂点の数が10,000を超えるのは約10のフィーチャだけです。「複雑な」とは、ポリゴンに多数の穴、乱雑なオーバーラップ、アイランドなどがあり、大きなポリゴンには、小さなポリゴンの多くをカバーする境界ボックスがあり、おそらくインデックスの有用性が低いことを意味します。

問題は、クエリが非常に遅くなり、使用できなくなることです。私はここでポールの2009年の投稿を読んだので、私のクエリはまだかなり高速であるはずだと思いました。次のコマンドを使用しています。私は露骨に間違っている、または非効率的なことをしていますか?

SELECT  ST_Union(f.geom) as geom, column1,column2,column3
FROM "inputlayer" As f 
GROUP BY column1,column2,column3

編集:私は使用しています:

POSTGIS="2.1.4 r12966" GEOS="3.3.3-CAPI-1.7.4" PROJ="Rel. 4.7.1, 23 September 2009" GDAL="GDAL 2.0.0dev, released 2014/04/16" LIBXML="2.7.8" LIBJSON="UNKNOWN" TOPOLOGY RASTER PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit

私がdbサーバーを実行しているマシンは、パワーのない仮想マシンです。SET work_mem = 50000のアイデアを試してみて、どうなるか見てみましょう!


明確にするために、column1、column2、およびcolumn3のすべての組み合わせのジオメトリの結合が必要ですか?大きく複雑で遅いと定義できますか?
John Powell

1
ジョン; はい、列1、2、3のすべての組み合わせの和集合が必要です。「大」を定量化する方法がわかりません。しかし、これは、複雑な重なり合いや島など、非常に複雑な(頂点が多い)ポリゴンの数です。I 「最後の質問に答える前に、「説明」を調査する必要があります!
ダレンコープ2015年

Explainは、主にテーブル統計、インデックスなどに基づいて、実際に行を読み取るためのディスクシーク時間を測定するため、この場合はあまり役立ちません。ST_Unionなどの関数の実行時間は考慮されません。などの多角形、重複の数、の複雑さに依存して...
ジョン・パウエル

1
質問を編集して詳細を追加してください。
Vince

1
GEOSのバージョンにも依存します。より優れた集計アルゴリズムがバージョン3.1.0で導入されました。
Scro

回答:


3

この種の操作は、私が覚えているように大量の作業メモリを使用するため、かなり低いデフォルト設定になっていないことを確認する必要があります。

のようなものを試してください

SET work_mem=50000;
Then run your query

あなたはそのworkmem設定で遊んでみたいかもしれません

画面に出力するのではなく、それをテーブルにダンプすることもできます。私はあなたがすでにそれを知っていると思います

あなたが確認したい他のこと-私はコメントに入れましたが、ここで繰り返します:

ユニオンの速度を改善した2つの点があります-あなたが指摘したカスケードの点と、ポリゴンカウントの場合、より高速な配列アキュムレーション(PostGIS 1.5(1.4は思い出せないかもしれません)にあると思います)、PostgreSQL 8.4(マイグレーション9.0は可能)思い出せない))。また、<PostGIS 1.4を実行している場合は、新しいGEOSでもうまく機能しません。

したがって、postgisバージョンとpostgresqlバージョンの両方をチェックすることが重要です

SELECT postgis_full_version() || ' ' || version();

もありST_MemUnionます。より少ないメモリ、より多くのプロセッサを使用:postgis.net/docs/ST_MemUnion.html
Scro

3
その関数はかなり古いです。新しいST_Union実装では、実際にはその関数よりもメモリを節約できます。
LR1234567 2015年

2

ST_Unionを実行する前でも

データベースを分析してクエリ統計を更新します。

Autovacuumをまだ実行していない場合は、データベースをVACUUMしてパージします。メイン設定をチェックして、適切な値に設定されていることを確認してください。

shared_buffers should be 10% to 25% of available RAM
effective_cache_size should be 75% of available RAM 

work_memを変更してテストします。8MB、32MB、256MB、1GBに増やします。違いはありますか?

* 32MBがデフォルトです

ソース:https : //wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server


ありがとう。ANALYZE、VACUUM、shared_buffersとeffective_cache_sizeを増やしてみたところ、同じ問題が発生しました。時間の許す限り微調整していきます。
Darren Cope

@DarrenCopeどんな進歩?同じ問題に直面しています。
Michal Zimmermann

@zimmi; 残念ながらそうではありません:(私はまだ私が以前にいた場所です!あなたはまったく同じことをしていますか?おそらく例を共有し、類似点があるかどうかを確認します
Darren Cope

1
@DarrenCope ST_Buffer(St_Collect(wkb_geometry)、0)の方がはるかに高速で、ニーズに合っているようです。それもあなたを助けるかもしれません。
Michal Zimmermann、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.