【发布时间】:2011-09-09 13:54:58
【问题描述】:
我有一个数据库,其中包含地球上大约 100 万个地点(坐标)。我的网站有一张地图(谷歌地图),用户可以通过放大地图找到这些地方。
数据库是 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
可以做些什么来显着改善这种搜索?我应该有一个基于几何的索引吗?还是索引的其他设置选择不当(它们是默认设置)?
编辑------
我最终根本没有使用 SQL Server 空间索引。由于我只需要在地图的正方形内进行简单的搜索,因此使用十进制数据类型和普通的 = 搜索要快得多,并且完全可以达到目的。谢谢大家帮助我!
【问题讨论】:
标签: sql performance spatial