【问题标题】:Spatial (distance) averaging using SQL server使用 SQL 服务器进行空间(距离)平均
【发布时间】: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


【解决方案1】:

我最终找到了一个可管理的解决方案。首先,我创建了一个没有任何计算的临时表(因此每个表中的 X、Y、persons 和 myvar),其中 X 和 Y 在 500 以内。这需要大约 90 分钟的运行时间并提供 65m 行。然后我在其中添加列来计算距离衰减,然后在新表中创建一个聚合。这又花了一个小时。

感谢大家的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多