如何改进SQL的距离计算

时间:2016-04-14 16:22:12

标签: sql gps

我们正努力让最近的客户接触到每个客户。我们的SQL按预期工作,但即使对于一个小型测试数据库(4,000个客户,50个cust子集),它也需要几秒钟,显然它会随着数据库大小的增加而显着增加。

select ... custA data, custB data
from customers custA
left join customers custB on custB.id=
     (select custC.id
      from customers custC
      where custC.id<>custA.id
      order by distance(custA.lat,custA.lon,custC.lat,custC.lon) asc limit 1)
where ... custA conditions

距离是一个函数,可以准确计算出其名称的含义:)

当然,我们可以搜索某种过滤器,以便只比较相同状态或类似的客户......或者最大限度地放在lat或lon等的差异上,但有没有办法改进sql结构

THKS

1 个答案:

答案 0 :(得分:0)

我对你的问题提出了建议。我使用表变量来模仿您的Customers表和填充虚拟数据。为简单起见,我删除了距离函数的使用,但您可以在您的环境中轻松替换。

我正在利用ROW_NUMBER将您的内部查询替换为TOP 1

我的解决方案是为SQL Server编写的:

import matplotlib.pyplot as plt
import numpy as np
...
x = np.random.rand(100,1)

plt.ylabel('Relative Cumulative Frequency')
plt.xlabel('Normalized Eigenvalues')

binsCnt = 50
bins = np.append(np.linspace(x.min(), x.max(), binsCnt), [np.inf])
plt.hist(x, bins = bins, normed=1, histtype='step', cumulative=True)
# Limit X and Y ranges
plt.xlim(0, 2)
plt.ylim(0, 1)
plt.show()

我的子查询计算所有客户之间的距离,row_number函数允许我按距离排序,只选择较小的组合。

编辑:我现在使用视图计算距离并将其存储在sql server中。使用WITH SCHEMABINDING选项将允许sql server预处理视图,因此,对视图的多次调用将导致更快的查询。第一次运行查询时会产生影响。当引用的记录发生变化时,视图将自动更新。