【问题标题】:Are SQL Server 2008 Spatial Data features useful for mapping queries?SQL Server 2008 空间数据功能对映射查询有用吗?
【发布时间】:2011-03-17 09:08:41
【问题描述】:

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

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

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

现在,Lat/Long 索引的主要问题是它是点的“正方形”,因为我试图找到“x 和 y 之间的纬度”和“x 和 y 之间的长”,它可以' 并没有真正超级高效地使用索引,因为如果我在“一行”点上搜索的话。

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

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

【问题讨论】:

  • 好问题!我在 SQL2005 中所做的事情与您现在所做的非常相似,所以我很想听听人们的想法

标签: performance sql-server-2008 indexing spatial


【解决方案1】:

是的!查看this article 关于空间索引的信息。您会看到这些类型的索引比“索引矩形”方法更有效。此外,您不仅可以有效地查询“is point near another point”,还可以进行所有其他类型的地理操作。 Here's 类型上所有可用方法的完整列表。

【讨论】:

    【解决方案2】:

    找到这个:

    对于 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 倍),所以我显然仍然在做一些非常错误的事情。

    【讨论】:

      【解决方案3】:

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

      出于您的目的(纬度/经度),您需要地理图形类型,而不是地理度量。我相信空间索引设置了“嵌套边界三角形”类型的索引,这是对我们在没有它的情况下在 SQL 中强制执行的“边界框”类型的预处理的改进。

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

      【讨论】:

        【解决方案4】:

        你知道,大约 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 和 table1.Lat 在 (table2.Lat - 1) 和 (table2.Lat + 1) 之间 和 table1.Long 在 (table2.Long - 1) 和 (table2.Long + 1) 之间

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多