@beduin01

Можно ли увеличить скорость выполнения пространственного запроса?

Пытаюсь увеличить скорость обработки следующего пространственного запроса:
SELECT 
     osm_id, 
     name,  
     ST_DISTANCE(geometry, ST_SetSRID(ST_POINT(37.72308, 55.47957), 4326), true) as dist 
FROM 
     roads 
WHERE 
     ST_DWithin(geometry, ST_SetSRID(ST_POINT(37.72308, 55.47957), 4326), 1) ORDER BY dist LIMIT 1;


Запрос выполняется на небольшой территории 7.5 секунд.

Структура таблицы roads следующая:

newdb=# \d roads
                                   Table "public.roads"
  Column  |           Type            |                     Modifiers                      
----------+---------------------------+----------------------------------------------------
 id       | integer                   | not null default nextval('roads_id_seq'::regclass)
 osm_id   | bigint                    | 
 type     | character varying         | 
 name     | character varying         | 
 tunnel   | smallint                  | 
 bridge   | smallint                  | 
 oneway   | smallint                  | 
 ref      | character varying         | 
 z_order  | integer                   | 
 access   | character varying         | 
 service  | character varying         | 
 class    | character varying         | 
 geometry | geometry(LineString,4326) | 
Indexes:
    "roads_pkey" PRIMARY KEY, btree (id)
    "roads_geography" gist (geometry)
    "roads_geom" gist (geometry)


Тут видно что существует пространсвенный индекс geometry. Вопрос -- в терминологии PostgreSQL geometry и geography это одно и тоже или нет? Если нет, то как создать именно географический индекс?

Как можно увеличить скорость выполнения данного запроса?
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 1
smagen
@smagen
Руководитель разработки Postgres Professional
Чтобы мог использоваться быстрый поиск ближайших соседей (KNN GiST), делайте ORDER BY по выражению
geometry <-> ST_SetSRID(ST_POINT(37.72308, 55.47957), 4326)

Нужен PostgreSQL 9.5+, PostGIS 2.2+
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы