Ich bin ein Neuling in Postgis und habe ein Problem mit der Abfrageleistung.
Dies ist meine Frage:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
und das Problem ist, dass mein Multipolygon SEHR große Polygone enthält (600 Seiten lang in Word Doc!) und die Ausführung mehr als 2 Stunden gedauert hat!
Gibt es eine Möglichkeit, meine Abfrage zu optimieren oder eine andere zu verwenden?
Bitte Ihre Hilfe wird sehr geschätzt!
Es kommt darauf an, welche Art von Qualität - Präzision Sie benötigen. Sie können die Polygone natürlich vereinfachen, indem Sie Folgendes verwenden: http://postgis.net/docs/ST_Simplify.html
Während der Entwicklung meiner GIS-Anwendung habe ich häufig überlegt, wie Daten am besten minimiert werden können. Z.B. Wählen Sie beispielsweise die Polygone im Begrenzungsfeld vor. - Je nach Zoomstufe benötigen Sie keine ultrapräzisen Ergebnisse (st_simplify) usw.
Hoffe das hat dir ein bisschen geholfen!
quelle
Abhängig von Ihrer Postgres- und / oder SQL-Expertise haben Sie mehrere Möglichkeiten:
Analysieren Sie die Abfrage mit dem Befehl EXPLAIN , um herauszufinden, ob Sie auf einen bestimmten Engpass stoßen . Warnung: Manchmal ist die Ausgabe von EXPLAIN schwer zu verstehen
Wenn Sie erwarten, dass die meisten oder ein erheblicher Teil der Geometrien in Tabelle 1 das Multipolygon NICHT schneiden, können Sie versuchen, eine vorläufige Bedingung auf ein einfacheres Polygon anzuwenden (dh indem Sie das Multiploygon in kleinere Teile zerlegen) und dann den schwereren Multipolygonschnitt nur auf ausführen diese Ergebnisse. Ein Beispiel finden Sie weiter unten.
wenn und nur wenn CPU der Engpass (dh der Server stecken Computing Kreuzungen) I ist dumpf schlage vor , Sie bekommen einen größeren, schnelleren, leistungsfähigeren CPU oder mieten eine einmalige High-CPU Instanz aus Amazons EC2 und zerstören es , wenn du bist getan
Beispielabfrage für Punkt 2:Um die Leistung zu verbessern, können Sie auch die Unterauswahl st1 vorübergehend als Tabelle materialisieren , damit Sie sie indizieren können.@Nicklas weist in den Kommentaren zu Recht darauf hin, dass ein Beispiel für Vorschlag 2 nicht helfen sollte. Er hat recht, aber ich denke, ich habe (teilweise) auch recht.
Tatsächlich scheint es, dass eine sehr ähnliche Frage erst letzten November auf der Postgis ML gestellt (und beantwortet) wurde:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
und es stellt sich heraus, dass der Vorschlag darin besteht, das Polygon tatsächlich aufzubrechen, damit der Index am effektivsten falsche Schnittpunkte herausfiltern kann, die andernfalls durch eine einfache Grenzprüfung ausgelöst würden.
quelle
Verwenden vonST_SubDivide()
Für Version 2.2 von Postgis können Sie verwenden
ST_SubDivide
.Sie können auch
Hier verwenden wir
ST_SubDivide
, um das Polygon in Subpolygone mit 10 oder weniger Eckpunkten zu zerlegen.Dann
Tun Sie dies nicht, da dies zu Rundungsfehlern führt
Allgemeine Abstimmung
Lesen Sie auch den Abschnitt Leistungstipps in den Dokumenten. Stellen Sie sicher, dass Sie richtig eingestellt sind. Erwägen Sie eine Erhöhung
max_parallel_workers_per_gather
, um die Parallelisierung zu nutzen (derzeit standardmäßig deaktiviert).quelle