【问题标题】:SQL Optimising a spatial index for localised geography pointsSQL 优化本地化地理点的空间索引
【发布时间】:2014-05-29 14:11:03
【问题描述】:

我有 ~400k 兴趣点存储在 GEOGRAPHY 空间 sql 中。

我将使用 PointOfInterest.STDistance(@CentralPoint) 在发送到查询的 @CentralPoint 的某个半径范围内找到 PointOfInterest。

我已经阅读了一些关于网格分层的内容,并希望知道他们的东西的人推荐最明智的网格模式。默认是

LEVEL_1 = 中,LEVEL_2 = 中,LEVEL_3 = 中,LEVEL_4 = 中等

但我的情况是,我将只有在英国境内有兴趣点。尽管很棒,但我们只使用了相对规范的 terra Firma,所以我想知道在这种情况下是否有更好的网格模式可以在空间索引中使用。

作为基于地理的我不能使用漂亮的几何边界框。我也在使用 SQL Azure,它似乎没有空间帮助存储过程:(

【问题讨论】:

    标签: sql optimization indexing spatial spatial-index


    【解决方案1】:

    与以往的空间索引一样,您最终会发现在您的数据集上测试各种网格设置可能会产生与其他人不同的结果。也就是说,我发现在所有级别设置低,或中等、低、低、低,由于其简单的性质,使用积分会产生很好的效果。

    然而,为了充分利用索引,请考虑选择性地缓冲点并检查交叉点。同样,我发现它通常会产生更好的一致的低结果时间,但要根据您的数据进行测试。

    DECLARE @point GEOGRAPHY = GEOGRAPHY::STPointFromText('POINT(<coords>)', 4326);
    DECLARE @radius INT = 1000;
    
    SELECT
    *
    FROM <table>
    WHERE <GeographyColumn>.STIntersects(@point.STBuffer(@radius)) = 1;
    

    尽量避免切换到几何的冲动,因为虽然它会产生稍微快一点的查询,但由于使用平面模型,它更有可能产生“不正确”的结果。也就是说,如果搜索距离足够小,则在大多数情况下差异不会很明显。

    【讨论】:

    • 谢谢!请您简要解释一下您对低级网格的建议的优点,因为我认为在阅读它们时更精确的“高”听起来最好
    • @BritishDeveloper,使用低级网格可以保持索引相对轻巧和快速 - LLLL 最多只有 65536 个 4 级单元格。对多组信息(包括英国数据)的测试通常比其他组合产生更好或等于性能(我都试过了)。但是,在处理多边形时,需要更高的级别来更好地处理复杂性,以及对每个对象值的单元格进行试验。在某些情况下,我发现 MLLL 或 HLLL 更好,所以我也建议尝试它们,但对于 400k 行,我们说的是 10 的 ms 顶部
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多