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:
SELECT DISTINCT ON (st1.userid) st1.userid ,ST_AsText(st1.position), st1.timestamp
FROM (
select userid, position, timestamp from table1
WHERE ST_Intersects ( YOUR_MULTIPOL_BOUNDS_HERE,position)
) as st1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),st1.position)
ORDER BY st1.userid, st1.timestamp desc
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.