Индексы имеют большое значение при работе с таблицами, хранящими
пространственную информацию. Их использование позволяет значительно увеличить
скорость выполнения запросов. Поэтому попытаемся разобраться с тем, что они
из себя представляют и как с ними работать.
При загрузке данных в PostGIS с помощью ogr2ogr пространственные индексы были
созданы автоматически: `building_polygon_wkb_geometry_geom_idx`,
`highway_line_wkb_geometry_geom_idx`,
`railway_station_point_wkb_geometry_geom_idx`,
`water_polygon_wkb_geometry_geom_idx`. Откройте pgAdmin
и убедитесь в этом.
Чтобы показать насколько влияет наличие пространственного индекса на скорость
выполнения запросов, удалим пространственный индекс
`building_polygon_wkb_geometry_geom_idx`:
DROP INDEX building_polygon_wkb_geometry_geom_idx;
И выполним запрос:
SELECT wkb_geometry FROM building_polygon WHERE ST_Contains(wkb_geometry, ST_GeomFromText('POINT (30.32670 59.92843)', 4326));
pgAdmin показывает, что время выполнения данного запроса составляет
**337 мс**. Теперь заново создадим пространственный индекс и снова
выполним этот же запрос:
CREATE INDEX building_polygon_wkb_geometry_geom_idx ON building_polygon USING gist(wkb_geometry);
Время выполнения запроса составило **8 мс**.
Как работают пространственные индексы
-------------------------------------
При построении обычных (не пространственных) индексов создаётся иерархическое
дерево на основе значений индексируемого поля. В случае же с пространственными
индексами такое дерево строится на основе значений поля геометрии, а на
основе значений минимальных ограничивающих прямоугольников (**bbox**)
этих геометрий.
![][01-postgis-01]
На вышепредставленном рисунке всего лишь 1 линия пересекает жёлтую звезду
(красная), но число геометрий, bbox-ы которых пересекают bbox жёлтой звезды -
2 (красная и синяя).
Способ определения базой данных того, какая линия пересекает жёлтую
звезду, состоит из 2 частей. Сначала находятся все геометрии, bbox которых
пересекает bbox жёлтой звезды. Этот этап выполняется очень быстро за счёт
использования индексов. И только затем определяется какие именно из
отобранных на первом этапе геометрий на самом деле пересекают жёлтую
звезду.
В PostGIS используется структура пространственного индекса, которая называется
[R-дерево (Rectangle-tree)](http://ru.wikipedia.org/wiki/R-%E4%E5%F0%E5%E2%EE). Эта структура
данных разбивает пространство на множество иерархически вложенных и,
возможно, пересекающихся, прямоугольников (для двумерного пространства).
![][01-postgis-02]
Для принудительного обновления внутренней статистики, используемой
планировщиком запросов, рекомендуется после массовых вставок,
обновлений или удалений записей из таблицы выполнять команду
`VACUUM ANALYZE`:
VACUUM ANALYZE building_polygon;;
[01-postgis-01]: ../img/01-postgis-01.png
[01-postgis-02]: ../img/01-postgis-02.png