邮政编码产品查询| Haversine算法|性能

时间:2016-02-07 15:53:36

标签: c# sql sql-server haversine

我有一个根据邮政编码搜索项目的应用程序。

在搜索邮政编码时,我会返回来自该城市/社区的所有产品(通过解析邮政编码完成)。

我现在需要根据与原始邮政/邮政编码的距离对这些产品进行分类。

我在数据库中存储了Lat / Long,并计划使用Haversine公式来计算与原始查询的apprx距离。

我的问题是,应该在哪里计算。 我应该在返回数据集之前在存储过程中执行此操作吗?

或者我应该使用我的Lat / Long返回我的数据集,并在返回用户之前计算它的服务器端。

可能需要执行最多1000次结果的计算。

2 个答案:

答案 0 :(得分:3)

通常,数据库服务器是IO绑定的而不是CPU绑定的。 YMMV,但如果您的情况是典型的,则需要在DB服务器上执行Haversine计算。

我建议您为 arcsine 计算使用自定义查找表,因为您可以提供对数刻度的近似距离,例如:

  • 100M,
  • 300M,
  • 1公里,
  • 3公里,
  • 10公里,
  • 30公里,
  • > 30公里

    然后使用线性插值作为细化。

对于单个都市区域遇到的典型距离,您可以考虑仅使用2个或3个API项,而不是更精确的计算:

  • sin(x)= ~x - x ^ 3/6 + x ^ 5/120
  • cos(x)= ~1 - x ^ 2/2 + x ^ 4/24

回想一下,对于收敛的泰勒级数,第n个项之后的误差严格小于(n + 1)'st项的大小。这使您可以在达到所需精度后有效地终止计算,一般而言,由于地球不是均匀球体,因此Haversine公式仅为0.5%。

答案 1 :(得分:1)

您使用的是SQL Server 2008或更高版本吗?如果是这样,我建议使用内置地理数据类型而不是直接进行Haversine计算。您可以拥有一个包含邮政编码(例如90210)的邮政编码表,以及邮政编码的中心点或另一栏中邮政编码覆盖的整个区域(如果对您的申请有意义,则两者都有)。然后,您可以使用STDistance()函数计算距离。此外,通过空间索引,您可以获得按距离排列的列表而无需太多精力。