SQL Server 2008空间数据功能是否对映射查询有用?

时间:2009-08-27 19:23:20

标签: performance sql-server-2008 indexing spatial

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

我一直在查询此表,以获取适合某个点的半径范围内的所有记录。例如,“所有记录在5.89288,-104.919434之间的5英里内”

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

现在,Lat / Long索引的主要问题是点的“正方形”,并且因为我试图找到“在x和y之间拉”和“在x和y之间长”,它可以我真的非常有效地使用索引,因为如果我在搜索“一行”点就可以了。

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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倍(慢7倍),所以我显然仍然做错了。

答案 2 :(得分:1)

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

出于您的目的(纬度/经度),您将使用地理图形类型, geo 指标。我相信空间索引建立了一个“嵌套边界三角形”类型的索引,这是对我们在没有它的情况下被强制执行的“边界框”类型的预处理的改进。

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

答案 3 :(得分:0)

你知道,大约5年前我在星巴克做了拉丁/经度查询......

基本上,我们想将商店与配送中心联系起来。我在他们的运营部门工作,他们老实说无法判断哪个商店是由特定仓库提供的。

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

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

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

从table1,table2中选择*其中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度(纬度和长度),请不要尝试比较两个地理点。

换句话说,它使用NORMAL RELATIONAL INDEXES过滤掉了很多值,然后UDF距离计算的信息要少得多。

希望有所帮助,我会尽力帮助澄清我是否需要