PostGIS ST_Union-Leistung

8

Ich versuche, eine Auflösungsoperation in PostGIS mit dem Befehl ST_Union auszuführen.

Die Eingabeebene ist zugegebenermaßen ziemlich groß und komplex. Mit "groß" meine ich 57.771 Merkmale mit einer Anzahl von Scheitelpunkten zwischen 4 und 758.018 pro Merkmal, was einem Durchschnitt von 86 Scheitelpunkten pro Merkmal entspricht. Nur etwa 10 der Features haben> 10.000 Eckpunkte. Mit "komplex" meine ich, dass die Polygone viele Löcher, unordentliche Überlappungen, Inseln usw. haben und dass die großen Polygone dazu neigen, einen Begrenzungsrahmen zu haben, der viele der kleineren Polygone abdeckt, was möglicherweise weniger nützliche Renderindizes darstellt.

Das Problem ist, dass die Abfrage so langsam ist, dass sie unbrauchbar wird. Ich las Paul 2009 Post hier , die mich führen zu glauben , dass meine Frage immer noch ziemlich schnell sein sollte. Ich benutze den folgenden Befehl; mache ich etwas offensichtlich Falsches oder Ineffizientes?

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

Edit: Ich benutze:

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

Die Maschine, auf der ich den Datenbankserver ausführe, ist eine virtuelle Maschine ohne viel Strom. Ich werde die SET work_mem = 50000 Idee ausprobieren und sehen, wie die Dinge laufen!

Darren Cope
quelle
Um ganz klar zu sein, möchten Sie die Vereinigung der Geometrien für jede Kombination von Spalte1, Spalte2 und Spalte3? Können Sie groß, komplex und langsam definieren und was wird erklärt?
John Powell
1
John; Ja, ich möchte die Vereinigung für jede Kombination von Spalte 1,2 und 3. Ich bin nicht sicher, wie ich 'groß' quantifizieren soll - aber es handelt sich um eine Reihe sehr komplexer (viele Eckpunkte) Polygone mit chaotischen Überlappungen und Inseln usw. I. Ich muss etwas über "Erklären" recherchieren, bevor ich Ihre letzte Frage beantworten kann!
Darren Cope
Erklären ist in diesem Fall möglicherweise nicht sehr hilfreich, da es hauptsächlich die Suchzeit der Festplatte misst, um die Zeilen tatsächlich zu lesen, basierend auf den Tabellenstatistiken, Indizes usw. Es berücksichtigt nicht die Laufzeit einer Funktion wie ST_Union, die hängt von der Komplexität der Polygone, der Anzahl der Überlappungen usw. ab.
John Powell
1
Bitte bearbeiten Sie die Frage, um Details hinzuzufügen.
Vince
1
Hängt auch von Ihrer GEOS-Version ab. In Version 3.1.0 wurden bessere Aggregationsalgorithmen eingeführt.
Scro

Antworten:

3

Wie ich mich erinnere, verbraucht diese Art von Operation viel Arbeitsspeicher. Sie möchten also sicherstellen, dass Sie nicht die Standardeinstellungen für diese Operation haben, die ziemlich niedrig ist.

Versuchen Sie etwas wie

SET work_mem=50000;
Then run your query

Vielleicht möchten Sie mit dieser Workmem-Einstellung herumspielen

Sie möchten das auch in eine Tabelle kopieren - nicht auf dem Bildschirm ausgeben. Ich nehme an, das weißt du schon

Andere Dinge, die Sie überprüfen möchten - die ich in Kommentare eingefügt habe, aber hier wiederholen werde:

Es gibt zwei Dinge, die die Vereinigungsgeschwindigkeit verbessert haben - die Kaskadensache, auf die Sie hingewiesen haben, und für die Polygonzählung die schnellere Array-Akkumulation (die meiner Meinung nach in PostGIS 1.5 enthalten ist (möglicherweise 1.4 kann sich nicht erinnern), PostgreSQL 8.4 (möglicherweise 9.0) Ich erinnere mich nicht)). Auch ein neueres GEOS bringt nichts, wenn Sie <PostGIS 1.4 ausführen

Daher ist es wichtig, sowohl die Postgis-Version als auch die Postgresql-Version zu überprüfen

SELECT postgis_full_version() || ' ' || version();
LR1234567
quelle
Es gibt auch ST_MemUnion. Verwendet weniger Speicher, mehr Prozessor: postgis.net/docs/ST_MemUnion.html
Scro
3
Diese Funktion ist ziemlich alt. Ich denke, die neue ST_Union-Implementierung spart tatsächlich besser Speicher als diese Funktion.
LR1234567
2

Noch bevor Sie ST_Union ausführen

Analysieren Sie Ihre Datenbank, um die Abfragestatistiken zu aktualisieren.

VACUUM Ihre Datenbank zu löschen , wenn Sie Autovacuum noch nicht ausführen. Überprüfen Sie Ihre Haupteinstellungen, um sicherzustellen, dass sie auf sinnvolle Werte eingestellt sind.

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

Testen Sie das Ändern von work_mem : Erhöhen Sie es auf 8 MB, 32 MB, 256 MB, 1 GB. Macht es einen Unterschied?

* 32 MB sind Standard

Quelle: https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server

Mapperz
quelle
Vielen Dank. Ich habe gerade ANALYZE, VACUUM und das Erhöhen von shared_buffers und effektive_cache_size ausprobiert und hatte das gleiche Problem. Ich werde weiter optimieren, wenn es die Zeit erlaubt.
Darren Cope
@DarrenCope irgendwelche Fortschritte? Ich stehe vor dem gleichen Problem.
Michal Zimmermann
@zimmi; leider nicht :( Ich bin immer noch da, wo ich vorher war! Tun Sie genau das Gleiche? Teilen Sie vielleicht ein Beispiel und sehen Sie, ob es Ähnlichkeiten gibt
Darren Cope
1
@DarrenCope ST_Buffer (St_Collect (wkb_geometry), 0) scheint viel schneller zu sein und entspricht meinen Anforderungen. Es könnte Ihnen auch helfen.
Michal Zimmermann