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!
quelle
Antworten:
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
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
quelle
ST_MemUnion
. Verwendet weniger Speicher, mehr Prozessor: postgis.net/docs/ST_MemUnion.htmlNoch 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.
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
quelle