【问题标题】:How to speed up my spatial search in SQL Server?如何加快我在 SQL Server 中的空间搜索?
【发布时间】: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


    【解决方案1】:

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

    见:http://technet.microsoft.com/en-us/library/bb895373.aspx
    获取可以使用同时仍然能够使用索引的函数列表。
    如果使用任何其他函数,TSQL 将无法使用索引,从而扼杀性能。

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

    【讨论】:

    • 不是所有的Convert 也会影响性能吗? (问我,不一定是OP)
    • 索引已经是空间索引(请参阅我插入问题的“CREATE SPATIAL INDEX”)。转换者:不,在实际查询之前已经完成了一次。
    【解决方案2】:

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

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

    【讨论】:

    • 是的。我最终根本没有使用 SQL Server 空间索引。我将在上面的问题中添加有关它的信息。
    猜你喜欢
    • 2011-03-29
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多