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?

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.