У меня есть пространственная таблица в базе данных PostgreSQL / PostGIS. Каждая строка в нем представляет полигон. Это имеет следующую форму:
+----+--------+
|gid | way |
+----+--------+
|241 | 01030..|
Геометрический столбец - это «путь», который содержит геометрию для многоугольника. В WKT это: POLYGON (('....')). Я делаю много запросов ST_Contains к этой таблице, чтобы проверить, содержатся ли два полигона друг в друге, например:
Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16
Мне было интересно, как ускорить этот запрос и добавил пространственный индекс на таблицу:
CREATE INDEX table_way_gist ON table USING gist(way);
Но на самом деле я не вижу ускорения. Я создаю индекс ПОСЛЕ того, как я заполнил таблицу всеми полигонами ДО того, как я выполню запросы ST_Contains. Нужно ли добавлять индекс перед заполнением таблицы? Существуют ли специальные требования к таблице для работы с индексом? Проекция (srid) геометрического пути столбца установлена в 900913.
Я использую: psql (PostgreSQL) 9.1.4 / POSTGIS = "1.5.3"
источник
Как сказал unicoletti , суть индекса в столбце геометрии будет работать, только если вы используете ST_Contains () в выражении WHERE.
Например, если вы хотите знать все полигоны, которые содержат друг друга, вы можете использовать что-то вроде этого:
В этом случае, в зависимости от размера вашей таблицы и сложности ваших геометрий, индекс gist должен обеспечить значительное ускорение, так как ST_Contains начнет с фильтрации многоугольников, сравнивая их граничные блоки перед фактической проверкой их полной геометрии. Вы можете увидеть небольшое объяснение в учебнике OpenGeo .
источник