SQL Server中利用空间索引优化邻近Way查询性能的方法咨询
空间索引优化邻近Way查询的方案
完全可以通过创建空间索引大幅提升这类基于STDistance的邻近查询性能,尤其当Way表数据量较大时效果更显著。以下是具体实现步骤和优化建议:
一、创建空间索引的前提
Way表必须有主键:你的WayId是唯一标识符,可直接设为主键(未设置的话先执行ALTER TABLE Way ADD PRIMARY KEY (WayId);)。LineObject列必须是geography类型(你的场景已满足,因为通过Geography::STLineFromText创建)。
二、创建空间索引的SQL语句
执行以下语句为LineObject列创建空间索引:
CREATE SPATIAL INDEX SI_Way_LineObject ON Way(LineObject) USING GEOGRAPHY_GRID WITH ( BOUNDING_BOX = (-180, -90, 180, 90), -- 覆盖全球经纬度范围,可根据实际数据范围缩小(比如中国区域设为(73, 18, 135, 53)) GRIDS = (LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH), -- 网格密度,数据量越大越适合设为HIGH CELLS_PER_OBJECT = 16 -- 每个线对象分配的网格单元数,默认值即可 );
三、调整查询语句让索引生效
原查询直接ORDER BY LineObject.STDistance(@g)会触发全表扫描后排序,无法利用空间索引。需先通过空间索引筛选出指定范围内的候选Way,再从中取最近的一条:
DECLARE @g geography = 'POINT(long lat)'; DECLARE @searchRadius int = 1000; -- 搜索半径,单位:米,根据业务需求设置 SELECT TOP 1 * FROM Way WHERE LineObject.STDistance(@g) < @searchRadius -- 利用空间索引快速缩小候选集 ORDER BY LineObject.STDistance(@g);
如果无法预估合适的搜索半径,也可以用缓冲区域相交的方式筛选:
DECLARE @g geography = 'POINT(long lat)'; SELECT TOP 1 * FROM Way WHERE LineObject.STIntersects(@g.STBuffer(1000)) = 1 -- 筛选与点的缓冲区域相交的Way ORDER BY LineObject.STDistance(@g);
四、验证索引生效
在SSMS中按Ctrl+M开启实际执行计划,执行查询后若看到空间索引扫描或空间索引查找的操作,说明索引已正常发挥作用。
内容的提问来源于stack exchange,提问作者Satheesh
相关产品推荐
相关产品推荐

