Dan*_*ola 7 indexing performance spatial sql-server-2008
我有一个应用程序,基本上我有一个巨大的表(1亿条记录)的信息,每行包含一个lat/long值.
我一直在查询这个表,以获得适合某个点的半径范围内的所有记录.例如,"所有记录在5.89288,-104.919434之间的5英里内"
为此,我有一个Lat/Long列的索引,我得到了点的"边界",然后丢弃了我的ASP.Net应用程序中所有落在圆圈之外的点,因为那样更快而不是在SQL Server中进行循环计算.
注意:这是关于美国的所有数据,所以我认为地球是平坦的,我的计算,这足以满足我的需要.
现在,Lat/Long索引的主要问题是作为点的"正方形",并且因为我试图找到"在x和y之间拉"和"在x和y之间长",它实际上不是真的超级有效地使用索引,因为如果我在搜索"一行"点,就可以.
我一直在阅读SQL 2008的空间功能,但我还没有找到足够的具体信息来了解这对我是否有用.
所以问题是:SQL 2008是否有某种不同类型的索引可以使这种特定类型的查询比SQL 2005更快?
发现这个:
对于 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
Run Code Online (Sandbox Code Playgroud)
(LocGeog是地理栏目)
但奇怪的是,它的运行速度比我的常规旧查询慢得多(慢了 7 倍),所以我显然仍然在做一些非常错误的事情。