ST_Intersectionスロークエリ


11

2つのレイヤー間の交差を実行しようとしています。

  1. 一部の道路を表すポリラインレイヤー(最大5500行)
  2. さまざまなポイント(約47,000行)の周りの不規則な形状のバッファーを表すポリゴンレイヤー

最終的に、私がやろうとしているのは、ポリラインをこれらの多くの(場合によってはオーバーラップする)バッファーにクリップし、各バッファーに含まれる道路の全長を合計することです。

問題は、物事がゆっくり実行されていることです。これにどれくらい時間がかかるかはわかりませんが、34時間を超えるとクエリを中止しました。私は誰かが私のSQLクエリで間違いを犯した場所を指摘するか、これを行うより良い方法を教えてくれることを望んでいます。

CREATE TABLE clip_roads AS

SELECT 
  ST_Intersection(b.the_geom, z.the_geom) AS clip_geom,
  b.*

FROM 
  public."roads" b, 
  public."buffer1KM" z

WHERE ST_Intersects(b.the_geom, z.the_geom);


CREATE INDEX "clip_roads_clip_geom_gist"
  ON "clip_roads"
  USING gist
  (clip_geom);



CREATE TABLE buffer1km_join AS

SELECT
  z.name, z.the_geom,
  sum(ST_Length(b.clip_geom)) AS sum_length_m

FROM
  public."clip_roads" b,
  public."buffer1KM" z

WHERE
  ST_Contains(z.the_geom, b.the_geom)

GROUP BY z.name, z.the_geom;

元のroadsテーブル用にGiSTインデックスを作成しましたが、2番目のテーブル作成を行う前に(安全のために)インデックスを作成します。

PGAdmin IIIのクエリプランは次のようになりますが、解釈するスキルがあまりないのではないかと思います。

"Nested Loop  (cost=0.00..29169.98 rows=35129 width=49364)"
"  Output: st_intersection(b.the_geom, z.the_geom), b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
"  Join Filter: _st_intersects(b.the_geom, z.the_geom)"
"  ->  Seq Scan on public."roads" b  (cost=0.00..306.72 rows=5472 width=918)"
"        Output: b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
"  ->  Index Scan using "buffer1KM_index_the_geom" on public."buffer1KM" z  (cost=0.00..3.41 rows=1 width=48446)"
"        Output: z.gid, z.objectid, z.facilityid, z.name, z.frombreak, z.tobreak, z.postal_cod, z.pc_area, z.ct_id, z.da_id, z.taz_id, z.edge_poly, z.cchs_0708, z.tts_06, z.the_geom"
"        Index Cond: (b.the_geom && z.the_geom)"

この操作は数日間実行する運命にあるだけですか?現在、これをWindows用のPostGISで実行していますが、理論的にはAmazon EC2に配置することで、問題にさらにハードウェアを投げることができます。ただし、クエリは一度に1つのコアのみを使用していることがわかります(さらに使用する方法はありますか?)。


Postgisは何で実行されていますか?OSとプロセッサが要因の可能性があります。
マッパーズ

こんにちはMapperz:OSがWindows 7、CPUはCore 2 Duoプロセッサで、メモリーは4ギガバイト(32ビットPGSQL / PostGISのを実行し、Windowsのこと)される
ピーター・

回答:


6

ピーター、

どのバージョンのPostGIS、GEOS、およびPostgreSQLを使用していますか?
する

SELECT postgis_full_version()、version();

1.4から1.5とGEOS 3.2+の間では、この種の機能について多くの機能強化が行われています。

また、ポリゴンにはいくつの頂点がありますか?

やる

SELECT Max(ST_NPoints(the_geom))As maxp FROM sometable;

最悪のシナリオを把握するため。このような低速は、多くの場合、最終的にきめが粗すぎるジオメトリによって引き起こされます。その場合、最初に単純化することができます。

また、postgresql.confファイルを最適化しましたか?


こんにちはLR1234567: "POSTGIS =" 1.5.2 "GEOS =" 3.2.2-CAPI-1.6.2 "PROJ =" Rel。4.6.1、2008"年8月21日のlibxml = "2.7.6" USE_STATS ";"のPostgreSQL 9.0.3は、Visual C ++ビルド1500、32ビットでコンパイル」(現在、他のクエリを実行している)
ピーター・

Maxクエリは予想よりも速く実行されました:maxp = 2030
ピーター

1
2,030は実際には悪くありません。交差するポリゴンがたくさんある可能性があります。一般に、交差点は最も遅い部分です。実際に交差するレコードの数を数えてみてください。巨大になる可能性があります。
LR1234567

SELECT count(*)FROM public。 "roads" b、public。 "buffer1KM" z WHERE ST_Intersects(b.the_geom、z.the_geom);
LR1234567

1
910,978は巨大ですか?これは新しい技術から始めることのいいところです。私は規範的な期待は持っていません:
ピーター

1

役立つスタック交換の答え:https : //stackoverflow.com/questions/1162206/why-is-postgresql-so-slow-on-windows

postgresのチューニング:http : //wiki.postgresql.org/wiki/Performance_Optimization

経験から推奨するVACUUM ANALYZE


ありがとう、それは良いアドバイスのようですね。fork()ペナルティなどのWindowsの問題のいくつかは、単一の接続を実行しているため、ここでは問題になりません。また、VACUUM ANALYZEを実行しました。ただし、パフォーマンスの最適化についてはまだ掘り下げていません。
ピーター

1
一般的に、shared_buffersとwork_memが最も大きな違いをもたらします。shared_buffersの場合、Linuxの場合よりもWindowsの場合の方が少し制限があります
LR1234567

shared_buffersはすでにオンでしたが、work_memはオフでした。1 GBの作業メモリを追加しました。
ピーター

1

恥知らずのプラグ:)私たちの本の第8章と第9章を読むのに役立つかもしれません。プレスを熱くするだけです。これらの章では、こうした種類の質問の多くを取り上げています。

http://www.postgis.us/chapter_08

http://www.postgis.us/chapter_09


リンクが壊れています。これは、PostGIS in ActionまたはPostGIS Cookbookを参照していますか?
HeikkiVesanto

1
ああ、あなたは正しい。これらは、PostGIS in Actionの初版へのリンクであり、当時有効でした。第2版​​を導入したとき、リンク構造を変更する必要がありました。参照されている古いリンクは現在ここにあります:postgis.us/chapters_edition_1
LR1234567

0

空間クエリを最適化する2つのヒントを参照してください。彼らは私にとって非常にうまく機能します。 http://kb.zillionics.com/optimize-spatial-query/


2
この答えは、この特定のシナリオでそれらをどのように適用するかなど、もう少し詳細があればより良いでしょう。
BradHards
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.