SQL优化本地化地理点的空间索引

Bri*_*per 6 sql indexing optimization spatial spatial-index

我有~400k兴趣点存储在GEOGRAPHY spatial sql中.

我将使用PointOfInterest.STDistance(@CentralPoint)<@Radius查询这些点,以发送给查询的@CentralPoint 的某个半径内找到PointOfInterest.

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

LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM

但我的情况是,我只会 在英国境内有兴趣点.虽然很棒,但我们只采用了相关的terra firma规范,所以我想知道在这种情况下是否有更好的网格模式用于空间索引.

基于地理我不能使用可爱的几何边界框.此外,我使用的SQL Azure似乎没有空间帮助存储过程:(

Jon*_*amy 3

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

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

DECLARE @point GEOGRAPHY = GEOGRAPHY::STPointFromText('POINT(<coords>)', 4326);
DECLARE @radius INT = 1000;

SELECT
*
FROM <table>
WHERE <GeographyColumn>.STIntersects(@point.STBuffer(@radius)) = 1;
Run Code Online (Sandbox Code Playgroud)

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