写点什么

openGauss 内核分析(五):统计信息与行数估计(一)

作者:daydayup
  • 2023-07-28
    北京
  • 本文字数:725 字

    阅读完需:约 2 分钟

openGauss 内核分析(五):统计信息与行数估计(一)

行数估计


行数估算是代价估算的基础,来源于基表统计信息的推算,估算基表 baserel、Join 中间结果集 joinrel、Aggregation 中结果集大小,为代价估算做准备。


SQL 查询常常带有 where 约束(过滤条件),比如 SELECT * FROM tt WHERE string4 = 'AAAAxx'。知道了约束条件的选择率,也就是知道了通过扫描路径要扫描出来的结果所占的比例或者通过连接操作所获得的元组所占的比例,通过这个比例就可以推算出中间结果和最终结果的数量,进而使用这些数量来计算代价。


这里重点分析基表的简单查询——基于 OpExpr 类型的选择率计算,处理函数在 clause_selectivity。如果是过滤条件就调用 restriction_selectivity 函数来获得 OpExpr 表达式的选择率,如果是连接条件则调用 join_selectivity 函数来获得选择率。


SELECT * FROM tt WHERE string4 = 'AAAAxx'为过滤条件,调用 restriction_selectivity 进行选择率估算。





restriction_selectivity 函数识别出 string4 = 'AAAAxx'是形如 Var = Const 的等值约束,操作符的约束选择性计算函数存储在系统表 PG_OPERATOR,opno = 93 对应的选择率计算函数为 eqsel,通过 eqsel 函数调用 var_eq_const 函数进行选择率估算。在该过程中,var_eq_const 函数会读取 PG_STATISTIC 表中 string4 列分布信息,并利用 MCV 信息直接返回选择率为 0.25。



函数 set_baserel_size_estimates 计算估计行数。




函数调用关系:standard_planner-> subquery_planner-> grouping_planner-> query_planner-> make_one_rel-> set_base_rel_sizes-> set_rel_size-> set_plain_rel_size-> set_baserel_size_estimates-> clauselist_selectivity-> clause_selectivity-> restriction_selectivity-> OidFunctionCall4Coll-> eqsel->var_eq_const

用户头像

daydayup

关注

还未添加个人签名 2023-07-18 加入

还未添加个人简介

评论

发布
暂无评论
openGauss内核分析(五):统计信息与行数估计(一)_daydayup_InfoQ写作社区