如何加快我在SQL Server中的空间搜索?

时间:2011-09-01 11:05:10

标签: sql performance spatial

我有一个数据库,在地球上放置了大约100万个地方(坐标)。我的网站上有一张地图(Google地图),可让用户通过放大地图来查找这些地点。

数据库是SQL Server 2008 R2,我已经为每个标记的位置创建了一个空间列。

问题是我需要大幅减少查询时间。一个例子是覆盖几平方公里的地图区域,其返回可能20000点 - 该查询在非常快的四核处理器上花费大约6秒的CPU时间。

我从地图的可见区域构建一个形状,如下所示:

DECLARE @shape GEOGRAPHY = geography::STGeomFromText('POLYGON((' +
CONVERT(varchar, @ne_lng) + ' ' + CONVERT(varchar, @sw_lat) + ', ' +
CONVERT(varchar, @ne_lng) + ' ' + CONVERT(varchar, @ne_lat) + ', ' + 
CONVERT(varchar, @sw_lng) + ' ' + CONVERT(varchar, @ne_lat) + ', ' +
CONVERT(varchar, @sw_lng) + ' ' + CONVERT(varchar, @sw_lat) + ', ' +
CONVERT(varchar, @ne_lng) + ' ' + CONVERT(varchar, @sw_lat) + '))', 4326)

然后查询基于此进行选择:

@shape.STIntersects(MyTable.StartPoint) = 1

a)我确保索引真正使用(检查实际的执行计划)。还尝试了索引提示。 b)我还尝试通过从地图中心选择特定距离内的所有内容进行查询。它有点好,但它仍然需要很多秒。

空间索引如下所示:

CREATE SPATIAL INDEX [IX_MyTable_Spatial] ON [dbo].[MyTable] 
(
    [MyPoint]
)USING  GEOGRAPHY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

可以做些什么来显着改善这种搜索?我应该使用基于几何的索引吗?或者是否有其他错误选择的索引设置(它们是默认设置)?

EDIT ------------------

我最终根本没有使用SQL Server Spatial索引。由于我只需要在地图的正方形内进行简单搜索,因此使用十进制数据类型和普通< =和> =搜索速度要快得多,并且完全足够用于此目的。谢谢大家帮助我!

2 个答案:

答案 0 :(得分:1)

SQL Server 2008(及更高版本)支持SPATIAL索引。

请参阅:http://technet.microsoft.com/en-us/library/bb895373.aspx
可以使用的功能列表,同时仍然可以使用索引 如果使用任何其他函数,TSQL将无法使用索引,从而查看性能。

请参阅:http://technet.microsoft.com/en-us/library/bb964712.aspx
有关空间索引的一般信息。

答案 1 :(得分:1)

您是否尝试过使用“索引提示”?例如:

SELECT * FROM [dbo].[TABLENAME] WITH(INDEX( [INDEX_NAME] ))
WHERE 
[TABLENAME].StartPoint.STIntersects(@shape) = 1