Підвищення продуктивності через індекс 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 сканування»), а індекс GiST на the_geomв 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), вона вказує на "Index" (= використовує індекс, який може значно прискорити роботу), а не "Seq Scan" (= сканування послідовностей, тобто перевірка кожного рядок, щоб побачити, чи знаходиться всередині, що може бути повільніше). Якщо ви додаєте / видаляєте індекс 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, тому ви очікуєте, що цей запит буде повільнішим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.