Ich habe eine PostgreSQL-Tabelle mit fast 2 Millionen Zeilen und einem langen coordinates
Feld in der Form POINT(-73.4938 33.2405)
.
Angenommen, es gibt einen Geodatenindex für dieses Feld. Was ist der effizienteste und schnellste Weg, um alle Zeilen innerhalb eines beliebigen Begrenzungsrahmens auszuwählen?
Die Box ist wie SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
postgis
performance
geography-data-type
Avishai
quelle
quelle
Antworten:
Angenommen, die angegebenen Begrenzungsrahmengrenzen befinden sich im selben räumlichen Bezugssystem wie die gespeicherten Koordinaten, und Sie wissen, welchen räumlichen Operator Sie benötigen (überschneiden oder enthalten durch):
Wenn Sie alternativ den Sound von "contain" (anstelle von "contain by") bevorzugen
WHERE
, sollte die Klausel umgedreht werden:PS: Angesichts der Tatsache, dass es sich bei den Aufzeichnungen (nach der Veröffentlichung von OP) um einfache Punkte handelt, denke ich, dass der Unterschied zwischen "Schnittpunkten" und "Eindämmung" sehr subtil wird und nur die Punkte an den Rändern des Begrenzungsrahmens betrifft .
quelle
What's the fastest ...?
: OP&&
und@
scheinen nicht zu funktionieren, wenn Sie sich mit Polygongeometrie schneiden. In diesem Fall verwenden SieST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
oder alternativST_Contains
quelle
Anscheinend habe ich nicht genug Punkte, um einen Kommentar hinzuzufügen, daher benutze ich diese Antwort nur, um zu sagen, dass ich versucht habe, ST_MakeEnvelope mit dem mathematischen Vergleich von "x> min_x und x <max_x und y> min_y und y <max_y" zu vergleichen. ..im Durchschnitt hat ST_MakeEnvelope 60 ms gedauert und das Vergleichen mit Mathematik hat 155 ms gedauert bei meiner speziellen Bbox-Abfrage.
Die räumliche Suche ST_MakeEnvelope sollte also schneller sein als der mathematische Vergleich!
quelle
INDEX
über ST_MakeEnvelope und (ST_XMax, ST_XMin, ST_YMax, ST_YMin) durchgeführt, und der Unterschied ist immens günstig für Mathe. Die Berechnung dauerte weniger als 20 Sekunden (INDEX + Abfrage), während die Umschlagkreuzung mehr als 2 Minuten dauerte (ich gab auf, als sie 2 Minuten, 40