一. 前言
在openGuass中,如果对索引列执行max/min操作,openGauss会优化成只读取索引的最前/后的一行数据,避免了对整表数据进行读取和聚合操作,如下所示:
二. min/max优化代码走读
1. 首先需要将min/max 算子转成成执行计划中降序/升序的keypath,代码流程如下所示:
preprocess_minmax_aggregates
find_minmax_aggs_walker // 从pg_aggregate中查出max/min对应的aggsortop,max对应的是>, min对应的是<
get_equality_op_for_ordering_op //根据aggsortop到pg_amop表中查找对应的op信息,如amopstrategy等,对应是查询中是需要顺序扫描还是逆序扫描
build_minmax_path
sortcl->eqop = eqop;
sortcl->sortop = sortop
parse->sortClause = st_make1(sortcl); // 已经将max/min聚合操作映射成排序操作,max对应的是逆序,min对应着是顺序
parse->limitCount = makeConst(1) // 其实已经将执行计划中的max替换成了order by desc limit 1,min被替换成了 order by asc limit