首页 文章 精选 留言 我的

精选列表

搜索[opengauss],共393篇文章
优秀的个人博客,低调大师

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

目录 统计信息 行数估计 SQL引擎执行查询主要经历了词法语法解析、查询重写、查询规划和计划执行等步骤。其中,在查询规划过程中,为了生成可执行的最优计划,首先要生成路径,而由于路径存在多样性,因此需要对路径进行淘汰选择。目前优化器进行路径的选择主要是基于估算的代价,因此这种优化器也被称为基于代价的优化器(Cost Based Optimization,CBO)。相对于逻辑优化,这种优化方法是物理优化:根据数据的分布(统计信息)情况来对查询执行路径进行评估,从可选的路径中选择一个执行代价最小的路径进行执行,例如是否选择索引SeqScan vs. IndexScan,选择哪个索引,两表关联选择什么样的连接顺序,选择怎样的具体算法等。 在代价估算时,需要使用基表或连接表的行数,而在很多时候,优化器无法获得准确的行数值,因此需要对行数进行估算(Cardinality Estimation),然后再计算代价。 统计信息 统计信息是物理优化的依据,来源于表信息的统计。其中描述基表数据的特征包括唯一值、MCV(Most Common Value)值等,用于行数估算。 Table-Level表级别统计信息,存储在系统表pg_class。 relptuples总元组数:描述表对应的元组数。 relpages总页面数:描述表对应的磁盘页数。 Column-Level列级别统计信息,存储在系统表pg_statistics,也可以使用视图pg_stats查看数据。 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”为“STATISTIC_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的oid为40960,有10000行数据占用345个pages页。第1列unique1的分布情况可以从直方图信息获取,直方图有100个区间,并且没有空值和MCV。第16列string4的分布情况可以通过MCV信息获取,这一列有4个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表中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

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册