Sql oracle地理编码查询非常慢,如何优化动态字段?

Sql oracle地理编码查询非常慢,如何优化动态字段?,sql,oracle,geocoding,Sql,Oracle,Geocoding,我有一个Oracle table 12K records/gyms,下面的查询大约需要0.3秒: SELECT (acos(sin(41.922682*0.017453293) * sin(to_number(LATITUDE)*0.017453293) + cos(41.922682*0.017453293) * cos(to_number(LATITUDE)*0.017453293) * cos(to_number(LONGITUDE)*0.017453293 - (-87.65432*0

我有一个Oracle table 12K records/gyms,下面的查询大约需要0.3秒:

SELECT (acos(sin(41.922682*0.017453293) * 
sin(to_number(LATITUDE)*0.017453293) + cos(41.922682*0.017453293) *
cos(to_number(LATITUDE)*0.017453293) * cos(to_number(LONGITUDE)*0.017453293 -
(-87.65432*0.017453293)))*3959) as distance 
FROM gym

但是,我想用钱返回距离的所有记录。具体而言,Oracle Spatial。

最重要的是:

使用where子句排除距离您的点超过10公里/英里的所有经度和纬度。因此,您只需对10km/miles街区内的窗口进行计算。 作为一个非常粗略的近似值,你可以使用0.1度作为一个规则,这在赤道是11公里,其他地方更少 所以加上

如果使用嵌套查询,请将其添加到最深层

因为你的距离小于10公里或英里,你可以考虑一个单位纬度/经度的长度为常数,并使用公式计算一次。添加边界框后,可以使用毕达哥拉斯规则计算距离。这就是人们通常使用数据进行计算的基本原因。 其他事项:

如果没有索引,order by总是很慢。您需要点菜吗? 将经度和纬度保存为表中的数字。为什么要将它们存储在不同的数据库中?
1您如何测量第一次查询的0.3秒?我敢打赌,您测量的是获取第一行所需的时间,而不是获取最后一行所需的时间。如果可能的话,大多数客户机工具将在数据库完成生成结果之前很久就开始显示结果,如果没有orderby,几乎可以肯定这一点。因此,您可能正在测量第一次查询计算到前50或500个健身房的距离所需的时间,而上一次查询计算到所有12000个健身房的距离所需的时间

2是Oracle数据库所有版本都附带的功能,它包括使用空间索引的能力,并提供了计算距离的内置方法。它的功能远不如Oracle Spatial,但它应该足以满足您在这里讨论的内容


3如果你想自己动手,我会支持约翰·维德的建议,即使用

谢谢你的指点。在这种情况下,距离是动态的,不能有索引,您的SQL语句是不正确的,因为“距离”字段不能在Oracle中的同一个select中引用这只在mysql中有效,我不确定您所说的保存lat和long as数字是什么意思,您能澄清一下吗?好的,我已经删除了答案的这一部分。最相关的部分是在实践中我发现的边界框,其中经度--87.65
SELECT * from (SELECT (acos(sin(41.922682*0.017453293) *
sin(to_number(LATITUDE)*0.017453293) + cos(41.922682*0.017453293) *
cos(to_number(LATITUDE)*0.017453293) * cos(to_number(LONGITUDE)*0.017453293 -
(-87.65432*0.017453293)))*3959) 
as distance FROM gym) 
WHERE distance <= 10 
ORDER BY distance asc
 WHERE (longitude - -87.65)<0.1 and (latitude - 41.922)<0.1