ST_Intersection langsame Abfrage

11

Ich versuche, einen Schnittpunkt zwischen zwei Ebenen durchzuführen:

  1. Polylinienebene, die einige Straßen darstellt (~ 5500 Zeilen)
  2. Polygonschicht, die unregelmäßig geformte Puffer um verschiedene Punkte von Interesse darstellt (~ 47.000 Zeilen)

Letztendlich versuche ich, die Polylinien an diesen vielen (manchmal überlappenden) Puffern zu befestigen und dann die Gesamtlänge der in jedem Puffer enthaltenen Fahrbahn zusammenzufassen.

Das Problem ist, dass die Dinge langsam laufen. Ich bin mir nicht sicher, wie lange dies dauern soll, aber ich habe meine Anfrage erst nach> 34 Stunden abgebrochen. Ich hoffe, dass jemand entweder darauf hinweisen kann, wo ich einen Fehler bei meiner SQL-Abfrage gemacht habe, oder mich auf einen besseren Weg hinweisen kann, dies zu tun.

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;

Ich habe einen GiST-Index für die ursprüngliche Straßentabelle erstellt und (um sicher zu gehen?) Vor der zweiten Tabellenerstellung einen Index erstellt.

Der Abfrageplan von PGAdmin III sieht folgendermaßen aus, obwohl ich leider nicht viel Geschick darin habe, ihn zu interpretieren:

"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)"

Ist diese Operation nur dazu verdammt, mehrere Tage zu laufen? Ich führe dies derzeit unter PostGIS für Windows aus, aber ich könnte theoretisch mehr Hardware auf das Problem werfen, indem ich es auf Amazon EC2 stelle. Ich sehe jedoch, dass die Abfrage jeweils nur einen Kern verwendet (gibt es eine Möglichkeit, mehr davon zu verwenden?).

Peter
quelle
Worauf läuft Postgis? Betriebssystem und Prozessor könnten ein Faktor sein.
Mapperz
Hallo Mapperz: Betriebssystem ist Windows 7, CPU ist Core 2 Duo, Speicher ist 4 GB (Windows, 32-Bit-PGSQL / PostGIS)
Peter

Antworten:

6

Peter,

Welche Version von PostGIS, GEOS und PostgreSQL verwenden Sie?
mach a

SELECT postgis_full_version (), version ();

Für diese Art von Dingen wurden zwischen 1.4 und 1.5 und GEOS 3.2+ viele Verbesserungen vorgenommen.

Wie viele Eckpunkte haben Ihre Polygone?

Mach a

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

Um ein Gefühl für Ihr Worst-Case-Szenario zu bekommen. Eine langsame Geschwindigkeit wie diese wird oft durch zu endgültig gekörnte Geometrien verursacht. In diesem Fall möchten Sie möglicherweise zuerst vereinfachen.

Haben Sie auch Optimierungen an Ihrer postgresql.conf-Datei vorgenommen?

LR1234567
quelle
Hallo LR1234567: "POSTGIS =" 1.5.2 "GEOS =" 3.2.2-CAPI-1.6.2 "PROJ =" Rel. 4.6.1, 21. August 2008 "LIBXML =" 2.7.6 "USE_STATS"; "PostgreSQL 9.0.3, kompiliert von Visual C ++ Build 1500, 32-Bit" (führt jetzt die andere Abfrage aus)
Peter
Die Max-Abfrage lief schneller als erwartet: maxp = 2030 Ich vermute, das ist ziemlich feinkörnig?
Peter
1
2.030 ist eigentlich nicht schlecht. Es könnte sein, dass Sie nur viele Polygone haben, die sich schneiden. Im Allgemeinen ist der Schnittpunkt der langsamste Teil. Versuchen Sie, zu zählen, wie viele Datensätze sich tatsächlich schneiden - er kann sehr groß sein.
LR1234567
SELECT count (*) FROM public. "Straßen" b, public. "Buffer1KM" z WHERE ST_Intersects (b.the_geom, z.the_geom);
LR1234567
1
Ist 910.978 riesig? Das ist das Schöne am Start einer neuen Technologie - ich habe keine normativen Erwartungen :-)
Peter
1

hilfreiche Antwort zum Austausch von Stapeln: /programming/1162206/why-is-postgresql-so-slow-on-windows

Postgres optimieren: http://wiki.postgresql.org/wiki/Performance_Optimization

Erfahrungsgemäß empfehlen wir VACUUM ANALYZE

Mapperz
quelle
Danke, das klingt nach einem guten Rat. Einige der Windows-Probleme wie die Strafe für fork () sollten hier kein Problem sein, da ich eine einzelne Verbindung verwende, oder? Haben Sie auch VACUUM ANALYZE ausgeführt. Ich habe mich jedoch noch nicht mit Leistungsoptimierung befasst.
Peter
1
shared_buffers und work_mem machen im Allgemeinen den größten Unterschied. Für shared_buffers sind Sie etwas eingeschränkter, wie viel Sie das unter Windows
tun
shared_buffers war bereits aktiviert, work_mem jedoch deaktiviert. Ich habe jetzt 1 GB Arbeitsmem hinzugefügt.
Peter
1

Schamloser Stecker :) Könnte helfen, Kapitel 8 und Kapitel 9 unseres Buches zu lesen. Nur heiß von der Presse. In diesen Kapiteln werden viele dieser Fragen behandelt.

http://www.postgis.us/chapter_08

http://www.postgis.us/chapter_09

LR1234567
quelle
Links sind defekt. Bezieht sich dies auf PostGIS in Aktion oder das PostGIS-Kochbuch?
HeikkiVesanto
1
Ah, du hast recht. Dies waren Links zur ersten Ausgabe von PostGIS in Action, die damals gültig waren. Als wir die 2. Ausgabe einführten, mussten wir die Linkstruktur ändern. Alte Links, auf die verwiesen wird, sind jetzt hier: postgis.us/chapters_edition_1
LR1234567
0

Beachten Sie die beiden Tipps zur Optimierung der räumlichen Abfrage. Sie arbeiten sehr gut für mich. http://kb.zillionics.com/optimize-spatial-query/

zgle
quelle
2
Diese Antwort wäre besser mit etwas mehr Details, wie man sie in diesem speziellen Szenario anwendet.
BradHards