【问题标题】:select closest point sql server spatial选择最近点 sql server 空间
【发布时间】:2016-07-14 14:54:46
【问题描述】:

我有一个表点,其中有一列点的类型为 GEOGRAPHY。我正在运行此代码以获得最近的点:

DECLARE @Wgs84Longitude FLOAT;
DECLARE @Wgs84Latitude FLOAT;

DECLARE @Point GEOGRAPHY = Geography::STPointFromText(N'POINT('
                                           + CAST(@Wgs84Longitude AS NVARCHAR(MAX))
                                           + N' '
                                           + CAST(@Wgs84Latitude AS NVARCHAR(MAX))
                                           + N')', 4326);

SELECT 
    TOP 1
    *
FROM Points
ORDER BY @Point.STDistance(Point) ASC;

Points 表有这个索引:

CREATE SPATIAL INDEX SpatialIndex ON Points (Point);

不幸的是,查询速度很慢。有什么我可以改进以使其更快(索引和/或查询方面)吗?

PS:

我也玩过一些这样的:

CREATE SPATIAL INDEX SpatialIndex ON [Core].[InternationalPostcodeList](Point) 
USING GEOGRAPHY_GRID
WITH 
(
--BOUNDING_BOX =(-8.164229, 49.18581, 8.05384, 60.717093)
        GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH) 
     , CELLS_PER_OBJECT = 64 
     , PAD_INDEX = OFF 
     , SORT_IN_TEMPDB = OFF 
     , DROP_EXISTING = OFF 
     , ALLOW_ROW_LOCKS = ON 
     , ALLOW_PAGE_LOCKS = ON 
) ON [PRIMARY];

性能还是不能接受。

【问题讨论】:

    标签: sql-server tsql sql-server-2014 spatial spatial-index


    【解决方案1】:

    Microsoft 自己在 MSDN 上的文章建议您可以进行一些改进,以确保“最近邻”查询使用空间索引。对我来说最重要的一点是在 WHERE 子句中没有使用 STDistance 来限制距离(没有它它无法以任何方式过滤)。

    尝试应用它,看看是否能提高性能。如果没有,请参阅文章本身以获取更多提示。

    MSDN Nearest Neighbor

    编辑

    首先,您可以简化在查询中创建点的过程,如下所示:

    DECLARE @Point GEOGRAPHY = GEOGRAPHY::Point(@latitude, @longitude, @srid);
    

    其次,它可能不会产生影响,但您可以将空间索引声明为 HHHH,最多 16 个单元格(您可以选择一个)。归根结底,作为一个奇点,它在最低级别的索引中只会有一条记录,但这取决于您是否要在列中混合空间数据类型。

    第三,我已经进行了几次测试,您应该可以轻松地在一秒钟内获得结果。我使用了以下查询:

    SELECT TOP 1
    *
    FROM
    Points P
    WHERE P.Point.STDistance(@Point) < (50 * 1609.344) -- 50 miles
    ORDER BY P.Point.STDistance(@Point)
    

    我的结果比 1 秒快得多。如果我省略了 WHERE 子句,时间会慢 1500% 左右(将随着数据集大小增加/减少)。但这仍然比您 10-12 秒的结果快得多。

    您能否验证您的空间索引是否有效?如果没有,请尝试使用 WITH(INDEX(SpatialIndex)) 提示。如果还是不行,能否上传您的查询执行计划?

    【讨论】:

    • 谢谢。当我按照文章中的建议引入 WHERE 子句时,显然强制使用空间索引,查询执行得更慢。
    • @csetzkorn 表格的大小(以行为单位)以及您目前的时间是多少?
    • @csetzkorn 好的,查询需要多长时间?
    猜你喜欢
    • 2012-08-10
    • 2012-03-11
    • 2013-08-25
    • 2019-01-30
    • 1970-01-01
    • 2019-03-29
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多