Повышение производительности за счет индекса GIST для точки в многоугольном запросе

10

У меня есть две таблицы: местоположения (id, region_id, the_geom) и регионов (id, the_geom). Для каждой точки местоположения я хочу определить регион, в котором она находится:

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

Имеет ли смысл строить индекс GIST по точкам расположения? Я построю индекс для полигонов региона, но я не уверен насчет точек. Это ускорит запрос?

Подземье
источник

Ответы:

14

Краткий ответ: Нет. При таком типе запроса UPDATE мы обновляем каждую строку в locations(«Seq Scan»), и индекса GiST в the_geomin regionsдостаточно, чтобы помочь ограничить строки для ST_Withinусловия, из которого нужно выполнить пару правой строки regions.


Более длинный ответ: магия для выяснения этого состоит в сравнении того, что вы получаете из запроса объяснения . В pgAdmin III есть кнопка «Объяснить запрос» в верхней части редактора запросов, или из pgsql, просто добавьте префикс к вашему запросу «объяснение»:

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)

Вам не нужно понимать все, что здесь кашляет. Ключевая вещь, которую нужно увидеть здесь, в самой внутренней части (SubPlan 1), она указывает «Индекс» (= использует индекс, который может значительно ускорить процесс), а не «Сканирование последовательности» (= сканирование последовательности, то есть проверка каждого строка, чтобы увидеть, если это внутри, что может быть медленнее). Если вы добавляете / удаляете индекс GiST locations, выходные данные этого запроса объяснения точно такие же, поэтому производительность запроса должна быть одинаковой.

Однако, если вы делаете что-то глупое и удаляете свой индекс GiST regions, вы видите другой план запроса из того же запроса, что и выше:

                             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)

Важная вещь, которую нужно увидеть между двумя запросами объяснения, - это максимальные оценки стоимости. Сравните 74,05 здесь с 8,52 ранее, поэтому можно ожидать, что этот запрос будет медленнее.

Майк Т
источник