openGauss内核分析(五):统计信息与行数估计(一)
  lYE0sTgD5uUi 2023年11月02日 57 0

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进行选择率估算。

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

openGauss内核分析(五):统计信息与行数估计(一)_操作符_02

openGauss内核分析(五):统计信息与行数估计(一)_操作符_03

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

openGauss内核分析(五):统计信息与行数估计(一)_函数调用_04

函数set_baserel_size_estimates计算估计行数。

openGauss内核分析(五):统计信息与行数估计(一)_结果集_05

openGauss内核分析(五):统计信息与行数估计(一)_操作符_06

函数调用关系: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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  QlMN2j7pChGO   2023年11月02日   28   0   0 操作符
  onyKAAZLmqqe   2023年11月02日   50   0   0 System操作符子类
lYE0sTgD5uUi