Домой О курсе Индексы имеют большое значение при работе с таблицами, хранящими пространственную информацию. Их использование позволяет значительно увеличить скорость выполнения запросов. Поэтому попытаемся разобраться с тем, что они из себя представляют и как с ними работать. При загрузке данных в 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