SQL Server 2008空间数据功能对于制图查询有用吗?

7
我有一个应用程序,在其中有一张包含100万行信息的巨大表格,每行包含一个纬度/经度值。
我不断地查询这个表格,以获取所有符合特定点周围半径范围内记录的信息。例如,“所有在39.89288,-104.919434半径5英里范围内的记录”。
为此,我在纬度/经度列上建立了索引,并获取“边界正方形”中的点,然后在我的ASP.Net应用程序中丢弃所有落在圆外的点,因为这比在SQL Server中执行圆计算更快。
注意:这是有关美国的所有数据,因此我认为地球是平坦的,这对我的需求足够精确。
现在,纬度/经度索引的主要问题是它是“点的正方形”,而且由于我正在查找“x和y之间的纬度和“x和y之间的经度”,所以它不能像在“一行”点上搜索那样高效使用索引。
我一直在研究SQL 2008的空间特性,但我没有找到足够具体的信息,以知道这是否对我有用。
因此,问题是:SQL 2008是否有一种不同类型的索引,可以使我针对这种特定类型的查询比使用SQL 2005更快?

好问题!我在SQL2005中做过与您现在所做的非常相似的事情,所以我很想听听人们想出了什么。 - Josh E
4个回答

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

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
< p >(LocGeog是地理信息列) < p>奇怪的是,尽管如此,这个查询比我的普通旧查询要慢得多(慢了7倍),所以我显然仍然做错了一些事情。

1

是的,使用SQL 2008空间数据可以很好地完成这个任务。在设置正确的网格级别的空间索引之后,可能需要一些专业知识和试错,但据朋友们告诉我,之后它应该非常棒(我自己没有在生产中使用过)。

对于你的目的(纬度/经度),你将需要地理类型而不是几何类型。我相信,在没有它的情况下,在SQL中我们被迫做的“包围盒”类型的预处理上,空间索引设置了一个“嵌套边界三角形”类型的索引,这是一种改进。

好的,建议您从Grant Fritchey的“Scary DBA之家”博客的此贴子开始(如果您想询问问题,请告诉他我推荐的:-))。 这是关于空间索引的一些性能分析和优化的好解释,并且还包括许多其他材料的链接。


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 between (table2.Long - 1) and (table2.Long + 1)

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

换句话说,它使用了普通的关系索引来过滤掉很多值,然后UDF距离计算需要处理的信息就少得多了。
希望这有所帮助,如果需要我会尽力澄清。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接