【发布时间】:2021-07-05 02:21:04
【问题描述】:
我有一个带有空间位置(X 和 Y 以及几何字段)的大表(约 1.5m 行)。我需要通过对附近点进行平均来创建此表中某个值的平滑版本。我希望每个点的影响都是这个距离的平方的倒数(这有时被称为重力加权)。
问题是查询速度非常慢,即使运行超过 50 个小时,我也从未完成它。有人对我如何提高性能有任何建议吗?我已经尝试使用数据的子集(表中的 1000 行),它在
geometry 字段有一个空间索引,查询统计显示它正在被使用。
SELECT t1.[X]
,t1.[Y]
,sum(t2.myvar*t2.persons/(power((t1.eastings-t2.eastings)/100+1,2)+power((t1.northings-t2.northings)/100+1,2)+1)) as wtXfit
,sum(t2.persons/(power((t1.eastings-t2.eastings)/100+1,2)+power((t1.northings-t2.northings)/100+1,2)+1)) as wt
FROM [Faststore].[dbo].[mytable] t1
full outer join [Faststore].[dbo].[mytable] t2 on t1.geom.STDistance(t2.geom)<=500
group by t1.[X]
,t1.[Y]
数据样本:
我在 GEOM 上的列 ID 和几何自动网格索引上有一个主键。
我也尝试过使用
【问题讨论】:
-
1st:可以添加示例数据吗?第二:你能添加你的表信息(pk、fk、索引)吗? 3rd:到目前为止,您尝试了什么?您是否在列上添加了例如索引? 4th:真的有必要在你的数据库中计算这个吗?
-
STDistance() 在其计算中包含一个不便宜的 sqrt() 操作,并且您在连接中执行了 2,250,000,000,000 个 STDistance() 操作(即:1.5M * 1.5M 行)。不要那样做。考虑不涉及 STDistance() 的替代方案,纬度/经度差
-
droebi:我已经编辑了我的帖子以添加该信息。谢谢
-
我尝试分摊查找最近邻居的成本的一个技巧是创建一个定义为
geom.STBuffer(500)的新列,然后查询具有geom.STIntersects(buffer) = 1或类似名称的邻居。跨度>
标签: sql sql-server geometry distance spatial