Mam tabelę przestrzenną w bazie danych PostgreSQL / PostGIS. Każdy wiersz w nim reprezentuje wielokąt. Ma on następującą formę:
+----+--------+
|gid | way |
+----+--------+
|241 | 01030..|
Kolumna geometryczna to „droga”, która zawiera geometrię wielokąta. W WKT jest to: POLYGON ((„....”)). Robię dużo zapytań ST_Contains na tej tabeli, aby sprawdzić, czy dwa wielokąty są w sobie zawarte, np .:
Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16
Zastanawiałem się, jak przyspieszyć to zapytanie i dodałem indeks przestrzenny do tabeli:
CREATE INDEX table_way_gist ON table USING gist(way);
Ale tak naprawdę nie widzę przyspieszenia. Indeks tworzę PO wypełnieniu tabeli wszystkimi wielokątami PRZED wykonaniem zapytań ST_Contains. Czy indeks należy dodać przed wypełnieniem tabeli? Czy są jakieś specjalne wymagania dotyczące pracy z indeksem? Rzut (srid) geometrycznej kolumny jest ustawiony na 900913.
Używam: psql (PostgreSQL) 9.1.4 / POSTGIS = „1.5.3”
źródło
Jak powiedział unicoletti , indeks gist w kolumnie geometrii działałby tylko wtedy, gdy użyjesz ST_Contains () w wyrażeniu WHERE.
Na przykład, jeśli chcesz poznać wszystkie wielokąty, które się zawierają, możesz użyć czegoś takiego:
W takim przypadku, w zależności od wielkości tabeli i złożoności geometrii, indeks gist powinien zapewnić znaczne przyspieszenie, ponieważ ST_Contains rozpocznie od filtrowania wielokątów przez porównanie ich ramek granicznych, zanim faktycznie sprawdzi ich pełną geometrię. Możesz zobaczyć małe wyjaśnienie w samouczku OpenGeo .
źródło