Leistungssteigerung durch GIST-Index für Punkte in Polygonabfragen

10

Ich habe zwei Tabellen: Standorte (id, region_id, the_geom) und Regionen (id, the_geom). Für jeden Standortpunkt möchte ich die Region bestimmen, in der er sich befindet:

UPDATE locations SET region_id = 
 (SELECT id FROM regions 
  WHERE ST_Within(locations.the_geom,regions.the_geom)
 );

Ist es sinnvoll, einen GIST-Index für die Standortpunkte zu erstellen? Ich werde einen Index für die Regionspolygone erstellen, bin mir aber über die Punkte nicht sicher. Würde es die Abfrage beschleunigen?

Unterdunkel
quelle

Antworten:

14

Kurze Antwort: Nein. Bei dieser Art von UPDATE-Abfrage aktualisieren wir jede Zeile in locations("Seq Scan"), und der GiST-Index auf the_geomin regionsreicht aus , um die Anzahl der Zeilen zu begrenzen, aus denen die ST_WithinBedingung die richtige Zeile koppeln soll regions.


Längere Antwort: Die Magie, um dies herauszufinden, besteht darin, zu vergleichen, was Sie aus der Erklärungsabfrage erhalten . In pgAdmin III befindet sich oben in einem Abfrageeditor die Schaltfläche "Abfrage erklären". In pgsql wird Ihrer Abfrage einfach "EXPLAIN" vorangestellt:

postgis=# explain UPDATE locations SET region_id =
postgis-#  (SELECT id FROM regions
postgis(#   WHERE ST_Within(locations.the_geom, regions.the_geom)
postgis(#  );
                                         QUERY PLAN
--------------------------------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..8755.54 rows=1000 width=110)
   SubPlan 1
     ->  Index Scan using regions_gist_the_geom on regions  (cost=0.00..8.52 rows=1 width=4)
           Index Cond: ($0 && the_geom)
           Filter: _st_within($0, the_geom)
(5 rows)

Sie müssen nicht alles verstehen, was hier oben gehustet wird. Das Wichtigste, was hier zu sehen ist, ist, dass im innersten Teil (SubPlan 1) "Index" (= verwendet einen Index, der die Dinge erheblich beschleunigen könnte) und nicht "Seq Scan" (= Sequenz-Scan, dh jeder überprüft) angezeigt wird Zeile, um zu sehen, ob es innerhalb ist, was langsamer sein kann). Wenn Sie einen GiST-Index hinzufügen / löschen locations, ist die Ausgabe dieser EXPLAIN- Abfrage genau gleich, daher sollte die Abfrageleistung gleich sein.

Wenn Sie jedoch etwas Dummes tun und Ihren GiST-Index entfernen regions, wird ein anderer Abfrageplan aus derselben Abfrage wie oben angezeigt :

                             QUERY PLAN
---------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..74288.00 rows=1000 width=110)
   SubPlan 1
     ->  Seq Scan on regions  (cost=0.00..74.05 rows=1 width=4)
           Filter: (($0 && the_geom) AND _st_within($0, the_geom))
(4 rows)

Das Wichtigste zwischen den beiden Erklärungsabfragen sind die maximalen Kostenschätzungen. Im Gegensatz zu 74,05 hier und 8,52 zuvor sollten Sie also erwarten, dass diese Abfrage langsamer ist.

Mike T.
quelle