资讯详情

openGauss内核分析-统计信息与行数估计

统计信息

行数估计


SQL引擎执行查询主要经过词法语法分析、查询重写、查询计划和计划执行。其中,在查询计划过程中,为了生成可执行的最佳计划,首先要生成路径。由于路径的多样性,需要淘汰路径。目前,优化器路径的选择主要是基于估计成本,因此该优化器也被称为基于成本的优化器(Cost Based Optimization,CBO)。与逻辑优化相比,该优化方法是物理优化:根据数据分布(统计信息)评估查询执行路径,从可选路径中选择执行成本最低的路径,如是否选择索引SeqScan vs. IndexScan,选择哪个索引,选择哪个连接顺序,选择哪个具体算法等。

在估价时,需要使用基表或连接表的行数,而优化器往往无法获得准确的行数值,因此需要估计行数(Cardinality Estimation),然后计算成本。

统计信息是物理优化的基础,来源于表信息的统计。基表数据的特征包括唯一值MCV(Most Common Value)用于行数估算。

relptuples总元组数:描述表对应的元组数。

relpages总页数:描述表对应的磁盘页数。

Starelid:表的oid。

Staattnum:表属性编号。

stadistinct:用于描述字段中唯一的非 NULL 数据值的数量一般用于估计集合分组后的大小,Join结果集大小。

stanullfrac:描述当前列NULL值在总数中的比例。

属性组{stakind1, stanumbers1, stavalues1}构成PG_STATISTIC表的卡槽,在PG_STATISTIC表中有5个卡槽。一般情况下,第一个卡槽存储MCV(Most Common Value)信息:描述出现频率大于一定百分比的值的集合,根据出现频率进行排序,通常用于表示哪些值倾斜。第二个卡槽存储Histogram除了直方图信息,描述直方图信息NULL值、MCV一般用于估计选择率。

以MCV以卡槽为例属性stakind1标识卡槽类型为MCV,其中1为1STATISTIC_KIND_MCV枚举值;属性stanumbers1与属性stavalues1记录MCV具体内容,其中stavalues1记录key值,stanumbers1记录key相应的频率。

系统表pg_statistics文件的定义pg_statistic.h中。

 #define STATISTIC_KIND_MCV    1 #define STATISTIC_KIND_HISTOGRAM  2 #define STATISTIC_KIND_CORRELATION    3 #define STATISTIC_KIND_MCELEM  4 #define STATISTIC_KIND_DECHIST    5

通过统计信息analyze命令获得。

表tt的oid40960有1000行数据占345pages页。第1列unique1的分布可以从直方图信息中获取,直方图有100个区间,没有空值和MCV。第16列string4的分布可以通过MCV这一列有四个信息获取列distinct值”AAAAxx” ,”HHHHxx” , “OOOOxx” , “VVVVxx” ,4个值的分布频率为0.25。

行数估算是成本估算的基础,来源于基表统计信息的估算和基表估算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表中string使用4列分布信息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

标签: 连接器345

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台