我试图让这个查询工作,不幸的是它很慢。所以我猜测可能有更好的查询来获得我正在寻找的结果。
Select samples.X, samples.Y, samples.id, samples.Provnr, samples.costumer_id, avg(lerhalter.lerhalt) from samples
left outer join lerhalter
on SQRT(POW(samples.X - lerhalter.x , 2) + POW(samples.Y - lerhalter.y, 2)) < 100
where samples.customer_id = 900417
group by samples.provnr
我有表样本,我想获取所有客户样本,然后加入“lerhalt”表。当我进行连接时,每个样本可能有多行,因此id就像获得列lerhalt的平均值。
我想我得到了我想要的结果,但对于只有100个样本的客户来说,查询最多可能需要10秒。客户有2000个样品。 所以我必须得到更好的查询时间。
有什么建议吗?
答案 0 :(得分:1)
小幅加速将省略SQRT功能。 SQRT()在计算时间方面很昂贵,您可以简单地将比较的右侧调整为100x100 = 10.000:
Select samples.X, samples.Y, samples.id, samples.Provnr, samples.costumer_id, avg(lerhalter.lerhalt) from samples
left outer join lerhalter
on (POW(samples.X - lerhalter.x , 2) + POW(samples.Y - lerhalter.y, 2)) < 10000
where samples.customer_id = 900417
group by samples.provnr
另外,您确定需要LEFT OUTER JOIN
吗?是否可以使用INNER JOIN
?
下一个问题:X和Y是否协调整数值?如果没有,它们可以转换为整数吗?整数分析通常比浮点运算快得多。
最后,你清楚地做了一个欧几里德距离测量。真的需要吗?另一种距离测量可以做得足够好吗?也许城市街区的距离足以满足您的需求?这将进一步加速事情。