У меня очень большое количество координат широты / долготы в Таблице 1, а также в Таблице 2. Например, предположим, что в обеих таблицах есть 100 000 координат.Мне нужно вернуть ближайшую пару координат в таблице 2 из таблицы 1, если они находятся в пределах установленного минимального расстояния (скажем, 100 метров) для каждого уникального элемента из таблицы 1 (до 100 000 элементов, но затем отбрасываютсядо 100 метров это мой ожидаемый выход).
Я довольно хорошо знаком с частями MSSQL Geometry и Geography и традиционно подхожу к следующему примерно так:
Select
Table1ID = T1.ID,
Table2ID = T2.ID,
Distance = T1.PointGeog.STDistance(T2.PointGeog),
Keep = 0
into #Distance
From #Table1 T1
cross join #Table2 T2
where T1.PointGeog.STDistance(T2.PointGeog) <= 100
, который возвращает все элементы из Table2, которые находятся в пределах 100метров Table1
Затем, чтобы ограничиться только самыми близкими предметами, я мог бы:
Update #Distance
set Keep = 1
from #Distance D
inner join
(select shortestDist = min(Distance), Table1ID from #Distance GROUP BY
Table1ID) A
on A.ID = D.Table1ID and A.shortestDist = D.Distance
и затем удалить все, где хранится <> 1
Это работает, однакоэто займет абсолютно навсегда.Перекрестное соединение создает абсурдное количество вычислений, которые должен выполнить SQL, что приводит к ~ 9-минутным запросам на MSSQL 2016. Я могу ограничить диапазон частей Таблицы 1 и Таблицы 2, которые я сравниваю с некоторыми критериями, но на самом деле это не так.много.Я просто действительно не уверен, как я мог сделать процесс быстрее.В конечном итоге мне просто нужно: ближайший предмет, расстояние от Т2 до Т1.
Я поиграл с несколькими различными решениями, но я хотел посмотреть, есть ли у сообщества SO какие-либо дополнительные идеи о том, как мне лучше оптимизировать что-то подобное.