【发布时间】:2019-02-13 14:46:38
【问题描述】:
我在表 1 和表 2 中有大量的纬度/经度坐标。例如,假设两个表中都有 100,000 个坐标。我需要从表 1 中返回表 2 中最接近的坐标对,只要它们在表 1 中的每个唯一项目(最多 100,000 个项目,但随后被剔除)的设定最小距离内(比如说,100 米)到 100 米是我的预期输出)。
我对 MSSQL 的几何和地理部分相当熟悉,并且通常会使用以下方法处理以下内容:
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 中距离 Table1 100 米范围内的所有项目
然后,为了仅限于最接近的项目,我可以:
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 需要处理的大量计算,这导致在 MSSQL 2016 上大约需要 9 分钟的查询时间。我可以限制表 1 和表 2 与某些标准进行比较的部分的范围,但实际上不是很多。我只是真的不确定如何使这个过程更快。最终,我只需要:最近的项目,从 T2 到 T1 的距离。
我尝试了一些不同的解决方案,但我想看看 SO 社区是否有任何关于如何更好地优化此类问题的其他想法。
【问题讨论】: