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

Mar*_*ark 5 c# sql sql-server haversine

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

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

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

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

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

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

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

Pie*_*ens 3

通常,数据库服务器是 IO 密集型的,而不是 CPU 密集型的。YMMV,但如果您的情况很典型,则需要在数据库服务器上执行半正矢计算。

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

  • 100米,

  • 300米,

  • 1公里,

  • 3公里,

  • 10公里,

  • 30公里,

  • > 30公里

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

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

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

还记得对于收敛的泰勒级数,第 n 项之后的误差严格小于第 (n+1) 项的大小。这使您可以在达到所需精度后有效地终止计算,由于地球不是均匀球体,半正矢公式的精度通常仅为 0.5%。