当前位置: 首页 > news >正文

GaussDB 数据库架构师修炼(十八) SQL引擎-统计信息

1 什么是GaussDB统计信息

统计信息描述了用户表中数据的分布特行数估算,代价估算提供数据基础。

2 表统计信息分级

1)表级别统计信息

reltuples总元组数:描述表对应的元组数

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

relallvisible可见页的数量:被标识为全可见 的页数

  • 2)列级别统计信息

Distinct值:用于描述字段里唯一的非NULL数据值的数目,一般用于估算集合分组之后的大小,join结果集大小
NULLFrac:用于描述当前列中 NULL值在总数中的占比
MCV( most common value):描述出现频率大于一定百分比的值的集合,表征高频值
Histogram直方图:描述除了NULL值, MCV 值以外的值的分布情况,GaussDB使用的是等高直方图,一般用于估算选择率

3)扩展统计信息

Multi-Column Statistics  多列统计信息
View-Statistics 视图统计信息

举证:

假设有t1.c1数据(表A ),有统计信息如(表 B,表C B:表级别统计信息

B:表级别统计信息

类型数值说明
reltuples行数150000当前表中共计15W条元组
relpages页面数200总共有200个数据页面

C:列级别统计信息

类型数值说明
NULL值比例0示例中没有NULL值,因此NULL值的比例为0
DISTINCT唯一值数量11示例中的0有重复值,去掉重复之后还有11个数字, 因此DISTINCT值的数量为11
MCV高频值[0],[0.33]示例中出现频率最高的值是0,出现了5次,因此MCV值是0,MCV由两个等长数组表示。其一是实际数值,其二是对应的频率
直方图[1, 5,  100]直方图首先排除MCV值,所以这里没有0。每个区间包含的元素个数相同, 1至5(含) 之间共有5个数, 5 (不含)至100之间共5个数。

 3 多列统计信息 

当谓词条件或者连接条件选取多个列进行过滤或者连接时,多列之间相关性较大,则不能使用独 立性假设去计算选择率。这里就需要收集多列统计信息。

4 行数估算

有了丰富的统计信息,优化器能够较为准确估算出表的基数和join中间结果集的大小,为代价估算做准备,从而选择更优的执行路径

  • 估算逻辑

 在实际做基数估计时,会有一些基本假设:
除了高频值mcv值外,其余值为均匀分布
数据遵从主外键约束, join尽可能match

  •  单表行数:

NULL值比例, MCV高频值,直方图

  •  join行数:

表行数, distinct值

 5 行数估算-谓词选择率 

等值谓词选择率估算方式如下:

对于接收到的常量等值谓词查询,分为4种情况计算选择率:

1) 常量为NULL,直接使用 NULL值比例

2)常量落在MCV中,直接使用对应值频率

3) 常量落在直方图中,需要通过公式进行计算:

记NULL值比例为pn

MCV频率总和为pm ,

distinct值为Nd

直方图中每两个数之间为一个桶,桶的Ns则平均每个桶distinct

则有选择率:

若桶的左右边界相等,记Neq表示和左右边界等值的桶的数量,则有

4)非以上情况则认为选择率为1/总数:

6 谓词选择率计算举证

select * from pg_stats where tablename='t1' and attname=Ia’;

1)Null_frac0,该表没有NULL

2)mcv选择率:可以看到该表有一个mcv值为150,频率为0.935033,则sela = 150  = 0.93503

3)不等边界桶:参考公式有

4)低频值:首先获取表总行数

则有 

 7 行数估算-连接估算 

两表join的行数估计主要通过基表的行数和 两表的distinct值来实现。

n1n2是两张表的行数, d1d2是两张表 join列的distinct值, RPV1RPV2是两列  中,每个值有多少行,则有join结果行数:

举证:

有两张表的统计信息如下:

1:总行数

表1:n_distinct值

表2:总行数

表2:n_distinct值

 则有d1  = 0.2  * 10000 = 2000d2  = 0.25  * 12000 =  3000,估算结果集为:

执行计划中行数:

 8 自动收集统计信息

GaussDB 提供自动收集统计信息的功能,通过autovacuum相关参数控制,如果表中数据量发生较大变化达到阈值时,会触发自动收集统 计信息。

  •    对于空表而言,当表中插入数据的行数大于50时,会触发表自动进行analyze 。
  •     对于表中已有数据的情况,触发自动收集的阈值设定公式计算如下:autovacuum_analyze_threshold+autovacuum_analyze_scale_factor  *  reltuples

其中reltuples是表的总行数;

autovacuum_analyze_threshold是触发自动收集的最小阈值,默认值为50;autovacuum_analyze_scale_factor是触发自动收集时表的规模因子,默认为10%

http://www.dtcms.com/a/348955.html

相关文章:

  • 用 WideSearch 思路打造「零幻觉、全覆盖」的多 Agent 信息收集器
  • SRE 系列(四)| MTTI 与 On-Call:高效故障响应之道
  • C++标准库算法:从零基础到精通
  • Go语言 Hello World 实例
  • 数据标注的质检环节有多少种
  • 单表查询-分析函数的应用
  • 智能体之推理引擎(3)
  • 记一次使用 C++ 实现多种扑克牌逻辑
  • ptrade `get_fundamentals` - 获取财务数据
  • 58 C++ 现代C++编程艺术7-模板友元
  • VC2022连接mysql
  • 微服务-21.网关路由-路由属性
  • 2025年KBS SCI1区TOP,新颖奖励与ε-贪婪衰减Q-learning算法+局部移动机器人路径规划,深度解析+性能实测
  • AI基础学习周报十
  • AI产品经理面试宝典第74天:技术边界与商业闭环的面试问题与答法
  • Trip Footprint_旅行分享功能模块技术架构天气模块技术架构
  • COSMIC智能化编写工具:革命性提升软件文档生成效率
  • 【文献阅读】Land degradation drivers of anthropogenic sand and dust storms
  • docker安装及常用命令
  • 卷王问卷考试系统—测试报告
  • 不只是关键词匹配:AI如何像人类一样‘听懂‘你在说什么
  • 【电路笔记 通信】混频器+混频器芯片(FSK/ASK收发器IC超外插接收器IC)+外差接收机 超外差接收机
  • Html相关
  • hot100 之104-二叉树的最大深度(递归+二叉树)
  • 分治--常见面试问题
  • 协程解决了什么问题
  • 中级统计师-统计实务-第一章 综述
  • CPTS-Agile (Werkzeug / Flask Debug)
  • 服务器加密算法
  • HMM+viterbi学习