我有一个数据库,在地球上放置了大约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索引。由于我只需要在地图的正方形内进行简单搜索,因此使用十进制数据类型和普通< =和> =搜索速度要快得多,并且完全足够用于此目的。谢谢大家帮助我!
答案 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