2016-10-19 9 views
0

Есть две таблицы MSSQL, которые содержат пространственные данные:
- AddressPoints - содержит геолокации адресов (POINT структуру)
- трубопровода - содержит геолокации трубопровода (LINESTRING структуру)
Расстояния между точкой и ближайшем LINESTING

Таблица AddressPoints должна содержать расстояние от ближайшего сегмента конвейера. В настоящее время я пытаюсь написать эффективный запрос. Я закончил с помощью следующего запроса:

select a.ogr_fid, min(a.geom.STDistance(p.geom)) 
from AddressPoints a, Pipeline p 
group by a.ogr_fid 

Однако AddressPoints и таблица трубопроводов содержат огромное количество данных, которое влияет на скорость выполнения. Обе таблицы содержат пространственные индексы, но я не уверен, использует ли этот запрос их.

+0

'MIN' предполагает, что вы ищете расстояние до ближайшего соседа, не все расстояния. [В этой статье MSDN] (https://msdn.microsoft.com/en-us/library/ff929109.aspx) объясняется, как написать запрос ближайшего соседа, который использует пространственные индексы. Требования довольно строгие –

ответ

0

Я думаю, что я нашел приемлемое решение:

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 секунд.