Bazy danychGIS

Tworzenie indeksów przestrzennych w PostgreSQL\PostGIS

Jak przyspieszyć zapytania przestrzenne w PostGIS? Nic prostszego – trzeba utworzyć indeks przestrzenny warstw. Pokażemy Wam jak to zrobić.

Do przykładu wykorzystamy dwie warstwy powiaty i drogi w mazowieckim. Obie warstwy możecie pobrać za darmo np. z projektu Open Street Map.

Sprawdzamy np. w pgAdminie czy nasze warstwy mają jakieś indeksy.

postgis_index_2

Przed pokazaniem Wam jak stworzyć zapytanie dodające indeks przestrzenny zobaczmy ile czasu zajmie nam wykonanie zapytania zwracającego liczbę dróg leżących w trzech powiatach województwa mazowieckiego. Wykonajmy takie zapytanie:

SELECT nazwa_powiatu, count(*)
FROM drogi_mazowieckie a, powiaty b
WHERE st_intersects(a.geom,b.geom) AND nazwa_powiatu IN ('powiat wyszkowski',' powiat wołomiński','powiat miński')
GROUP BY nazwa_powiatu

postgis_index_3

Czas wykonania zapytania wyniósł 1:26 minuty.

Wygenerujmy teraz indeksy przestrzenne dla dwóch używanych przez nas warstw używając zapytania SQL:

CREATE INDEX ON powiaty USING GIST(geom)
CREATE INDEX ON drogi_mazowieckie USING GIST (geom)

I powtórzmy zapytanie zliczające odcinki dróg w poszczególnych powiatach. Tym razem zapytanie zwróciło wynik w 1.9 sekundy.

Wygenerowanie dwóch indeksów przestrzennych trwało tylko 3.2 sekundy, a zapytanie wykonane za ich pomocą tylko 1.9 sekundy. Czas tych dwóch działań jest znacząco niższy niż czas potrzebny na wykonanie zapytania bez indeksów. Widać zatem, że zastosowanie indeksów znacząco przyspiesza naszą pracę. W PostgreSQL jest jeszcze wiele innych typów indeksów, ale o nich napiszemy innym razem.

Dla tych którzy chcą wiedzieć jak działa indeks przestrzenny odsyłamy do tej strony.