#sql-server #indexing #gis #distance
#sql-сервер #индексирование #ГИС #расстояние
Вопрос:
Есть две таблицы MSSQL, которые содержат пространственные данные:
— Адресные точки — содержит геолокацию адресов (ТОЧЕЧНАЯ структура)
— Конвейер — содержит геолокацию конвейера (структура LINESTRING)
Таблица адресных точек должна содержать расстояние от ближайшего сегмента конвейера. В настоящее время я пытаюсь написать эффективный запрос. В итоге я получил следующий запрос:
select a.ogr_fid, min(a.geom.STDistance(p.geom))
from AddressPoints a, Pipeline p
group by a.ogr_fid
Однако адресные точки и таблицы конвейера содержат огромное количество данных, которые влияют на скорость выполнения.
Обе таблицы содержат пространственные индексы, но я не уверен, использует ли их этот запрос.
Комментарии:
1.
MIN
предполагает, что вы ищете расстояние до ближайшего соседа, а не все расстояния. В этой статье MSDN объясняется, как написать запрос ближайшего соседа, который использует пространственные индексы. Требования довольно строгие
Ответ №1:
Я думаю, что я нашел приемлемое решение:
select a.ogr_fid, min(a.geom.STDistance(p.geom))
from AddressPoint a
inner join Pipeline p on a.geom.STDistance(p.geom) < 200
group by a.ogr_fid
order by a.ogr_fid
Этот запрос выполняет ту же работу, что и запрос из вопроса. Однако он выполняется за 1 секунду. Время выполнения первого запроса составляет 47 секунд.