开启时空两阶段查询优化

Ganos在时空索引框架基础上进行的深度优化,可减少时空查询中额外的数据I/O及计算开销。

背景信息

时空引擎传统的查询都是经典的两阶段查询处理方法(粗糙集过滤和精确过滤),首先利用时空多维索引进行粗糙集过滤,筛选出来的中间结果集再经过精确函数判断,得到最终的结果集。

示例

先利用test表上的空间索引与查询对象进行粗过滤,得到中间结果集ID,根据中间结果集ID再取出实际的记录数据,利用st_intersects进行精确过滤,最终得到符合条件的记录集。

这其中,利用空间索引进行粗糙集过滤后,依旧有大量无关的对象需要进入到精确过滤阶段,一方面带来数据I/O开销,另一方面由于精确过滤计算过于复杂,会带来大量无用计算。

select id from test where st_intersects(ST_GeomFromText('POLYGON((250000 -268000, 250000 270000, 280000 270000,280000 -268000, 250000 -268000))', 3857),geom)=true;

两阶段查询优化

两阶段查询优化对于时空范围查询、PIP(point in polygon)查询等场景有较大的性能提升,该优化由RDS PostgreSQL中的guc参数控制,对用户使用透明,当前默认为关闭状态。

在数据库session中开启或关闭查询优化的命令如下:

-- 开启
SET rds_enable_gist_refine = true;
-- 关闭
SET rds_enable_gist_refine = false;