7

我有一个应用程序,基本上我有一个巨大的信息表(1 亿条记录),每一行都包含一个纬度/经度值。

我不断查询此表以获取适合某个点周围半径范围内的所有记录。例如,“39.89288,-104.919434 5 英里范围内的所有记录”

为此,我在 Lat/Long 列上有一个索引,我得到了点的“边界正方形”,然后在我的 ASP.Net 应用程序中丢弃了所有落在圆圈之外的点,因为这样更快而不是在 SQL Server 中进行圆计算。
注意:这是关于美国的所有数据,所以我认为地球是平坦的以进行计算,这对于我的需要来说足够精确。

现在,Lat/Long 索引的主要问题是它是点的“正方形”,因为我试图找到“x 和 y 之间的纬度”和“x 和 y 之间的长”,所以它不能真的超级高效地使用索引,就像我在“一行”点上搜索一样。

我一直在阅读 SQL 2008 的空间功能,但我没有找到足够的具体信息来了解这是否对我有用。

所以问题是:SQL 2008 是否有某种不同类型的索引可以使这种特定类型的查询比使用 SQL 2005 更快?

4

4 回答 4

5

是的!查看这篇关于空间索引的文章。您会看到这些类型的索引比“索引矩形”方法更有效。此外,您不仅可以有效地查询“是另一个点附近的点”,还可以进行所有其他类型的地理操作。这是该类型上所有可用方法的完整列表。

于 2009-08-28T12:48:21.533 回答
3

发现这个:

对于 SQL 2008:http:
//blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-2008-proximity-search-with-th

显然这是可能的

注意:该文章的 SQL 2005 版本的性能不太好。我已经尝试过这种方法,最好从 SQL Server 获取正方形,然后在您自己的代码中剔除圆。

更多感兴趣的链接:

http://msdn.microsoft.com/en-us/library/bb964712.aspx
(终于有解释了!!)

还有一个示例查询......显然这是我想要的搜索方式(5英里圆圈内的点):

DECLARE @Location GEOGRAPHY
SET @Location = GEOGRAPHY::STPointFromText('POINT(73.9517061 40.7934358)',4326).STBuffer(5 * 1600);
SELECT [fields] FROM [table] WHERE LocGeog.STIntersects(@Location) = 1

(LocGeog 是地理列)

不过,奇怪的是,这比我的常规旧查询慢得多(慢 7 倍),所以我显然仍然在做一些非常错误的事情。

于 2009-08-27T19:45:44.320 回答
1

是的,这可以通过 SQL 2008 空间数据很好地完成。在正确的网格级别设置空间索引时有一些专业知识/试验和错误(?),但在那之后它应该很棒(由朋友转给我,我自己没有在生产中使用它)。

出于您的目的(纬度/经度),您将需要 geographic type不是geo metric。我相信空间索引建立了一种“嵌套边界三角形”类型的索引,这是对我们在没有它的情况下在 SQL 中被迫执行的“边界框”类型的预处理的改进。

好的,我建议从Grant Fritchey 的“可怕 DBA 之家”博客上的这篇文章开始(如果你想问问题,告诉他我发给你了 :-))。这是对他刚开始学习的空间索引的一些性能分析和调整的一个很好的解释,还包括指向许多其他材料的链接。

于 2009-08-28T12:37:57.703 回答
0

你知道,大约 5 年前我在星巴克做纬度/经度查询……

基本上,我们想将商店与配送中心关联起来。我在他们的运营部门工作,他们真的无法分辨哪个商店是由特定仓库供应的。

所以我最终想出了这个“魔术圈”算法。

基本上,他们有一堆看起来像这样的查询: select * from table1, table2 Where UdfDistance(table1.Lat, table1.Long, table2.Lat, table2.Long) >= 250

我最终想出了一些非常相似的东西,但它运行得更快

select * from table1, table2 where UdfDistance(table1.Lat, table1.Long, table2.Lat, table2.Long) >= 250 and table1.Lat between (table2.Lat - 1) and (table2.Lat + 1) and table1 .Long 在 (table2.Long - 1) 和 (table2.Long + 1) 之间

基本上 - 如果两者之间的差异超过 1 度(纬度和经度),请不要尝试比较两个地理点。

换句话说,它使用正态关系索引来过滤掉很多值,然后 UDF 距离计算需要处理的信息要少得多。

希望有帮助,如果需要,我会尽力帮助澄清

于 2011-03-17T01:08:41.693 回答