2012-04-23 49 views
0

我们的商业用户喜欢我们的搜索是通过距离来完成的,问题是我们有超过100万条经纬度位置的记录。我们正在使用SQL 2008,但是当我们按距离查询命令或限制搜索长度(30秒以上)时,我们会一直遇到问题。这是不可接受的,必须有更好的方法来做到这一点。我们已经尽全力使用SQL 2008,并希望在某些时候升级到2012年。空间数据距离搜索 - 优化选项

但我问,如果有另一种技术或优化,我们可以申请。我们可以切换到不同的数据库以获得更快的性能,应用不同的搜索算法,估算算法,树,网格,预计算等吗?

+1

问题,你目前使用SQLServer 2008中可用的空间索引吗? – javram 2012-04-23 19:55:41

+0

是的,我们已经在网格密度上来回移动,并且已经验证了索引正在被使用(同样使用with(index hint)。我们可以快速应用通用过滤器,但是只要我们通过我们执行距离顺序丢失所有表现,这似乎是最常见的投诉 – Josh 2012-04-23 23:26:53

+0

如果在过滤器限制返回的行数为500-1000之后按距离排序,是否会造成性能损失? – 2012-04-23 23:42:10

回答

0

一个解决方案,可能会在这里有用将打破你的搜索分为两个部分:

1)运行,你看到的是一个特定值+内或全部记录的查询 - 当前的纬度/经度(@latitude>(lat - .001)和@latitude>(lat - .001))和(@longitude>(lng- .001)和@经度>(经度 - .001))

使用这种方法,特别是在纬度和经度列上都有索引的情况下,您可以快速定义一组工作位置指定一段距离。 2)用步骤1的粗略结果,使用大圆圈/刚体法来确定源位置和每个点之间的实际距离是多少。

如果这种方法失败了,如果您正在搜索的半径没有任何限制,但是如果您想要查找给定点的特定距离内的所有位置,则此功能很有用。

+0

空间索引的主要过滤器做这个很快Ÿ,它只是似乎吓坏了的距离部分。 – Josh 2012-04-30 13:05:37

+0

你如何做大圆计算? – javram 2012-04-30 14:44:47

+0

STDistance,用于空间数据的MSSQL 2008的内置函数。我创建了自己的函数,甚至简化了计算(有错误),但没有任何运气来加速它。 – Josh 2012-04-30 18:16:51