postgresql_internals-14 学习笔记(六)—— 统计信息

news2024/11/24 17:52:05

不完全来自这本书,把查到的和之前的文章重新汇总整理了一把。

一、 统计信息的收集

 1. 主要参数

其中最主要的是track_counts,开启才会收集统计信息。

postgres=# select name,setting,short_desc,context from pg_settings where name like 'track%'; 
           name            | setting |                          short_desc                          |  context   
---------------------------+---------+--------------------------------------------------------------+------------
 track_activities          | on      | Collects information about executing commands.               | superuser
 track_activity_query_size | 1024    | Sets the size reserved for pg_stat_activity.query, in bytes. | postmaster
 track_commit_timestamp    | off     | Collects transaction commit time.                            | postmaster
 track_counts              | on      | Collects statistics on database activity.                    | superuser
 track_functions           | none    | Collects function-level statistics on database activity.     | superuser
 track_io_timing           | off     | Collects timing statistics for database I/O activity.        | superuser
 track_wal_io_timing       | off     | Collects timing statistics for WAL I/O activity.             | superuser

2. 相关进程

  • pg 15之前,由stats collector进程负责统计信息收集

       之前看文档这个进程的启动跟 /etc/hosts 配置还有关系,设置错误会导致进程起不来,可以参考:故障:autovacuum和stats collector进程未正常启动 - 墨天轮

  • pg 15取消了stats collector进程

       统计信息由放在临时文件改为放至共享内存,并在停库前由检查点进程写到文件系统

PostgreSQL 15: Stats Collector Gone? What's New?

3. 自动收集

由autovacuum触发。触发条件:

  • autovacuum_analyze_threshold:表被修改行数阈值,默认50
  • autovacuum_analyze_scale_factor:表被修改行数比例,默认0.1
  • 计算公式:pg_stat_all_tables.n_mod_since_analyze (自上次analyze以来被修改的行数)> autovacuum_analyze_threshold + autovacuum_analyze_scale_factor × pg_class.reltuples

       它也有对应普通表的表级同名参数,可以针对各表调整。toast表无需收集统计信息,因此没有针对它的参数。

postgresql_internals-14 学习笔记(二)常规vacuum_Hehuyi_In的博客-CSDN博客

4. 手动收集

analyze [verbose] [table[(column[,..])]]

  • verbose:显示收集进度
  • table:要收集的表名,如果不指定,则收集当前数据库中所有表的统计信息
  • column:要收集的列名,如果不指定,则收集所有字段的统计信息
  • analyze命令对表加4级锁,不阻塞写

5. 默认抽样数

300×default_statistics_target参数(默认100)

/* Default statistics target (GUC parameter) */
int			default_statistics_target = 100;

       为了调整所收集的统计信息的准确度,可以增大随机抽样比例,这个参数可以在session级别设置,也可以在列级别设置。

set default_statistics_target to xxx;
alter table tab_name alter column col_name set statistics xxx;

       

二、 基础统计信息

基础统计信息保存在pg_class中,主要是下面3项:

  • reltuples:表预估行数,也是执行计划里row=的来源之一,pg 14用-1表示没收集过统计信息,以区分于空表
  • relpages:表预估页数 relpages
  • relallvisible :vm(visibility map)文件中被标记的页数
SELECT reltuples::numeric, relpages, relallvisible FROM pg_class WHERE relname = 'tmp001';

未收集统计信息的表

CREATE TABLE tmp_copy(LIKE tmp001) WITH (autovacuum_enabled = false);
SELECT reltuples::numeric, relpages, relallvisible FROM pg_class WHERE relname = 'tmp_copy';

       在生成执行计划时,会按照表大小及字段宽度等预估行数,所以rows不会是0。并且如果表增大,预估的rows会相应增加(但如果delete删除表数据而表大小没有变化,则不会生效)。

具体可以参考:postgresql源码学习(56)—— explain是如何快速估算pg表行数的_Hehuyi_In的博客-CSDN博客

三、  详细统计信息

这部分内容存在pg_statistic系统表中,但里面的内容很难看懂,因此通常我们会看pg_stats视图

 pg_stats视图内容

下面是主要字段含义

1.  null_frac 空值比率

执行计划预估空值行数时,会用 reltuples * null_frac

insert into tmp001 select null from tmp001 limit 1000;

explain select * from tmp001 where aid is null;

SELECT round(reltuples * s.null_frac) AS rows
FROM pg_class JOIN pg_stats s ON s.tablename = relname
WHERE s.tablename = 'tmp001' AND s.attname = 'aid';

也可以明显看出来,是有误差的。 

2. n_distinct 非重复值

  • 如果值为负数,其绝对值代表非重复值在列中占比(总行数/非重复值)

       例如-1表示所有值均不重复(总行数/非重复值=1),-3表示非重复值占0.3(总行数/非重复值=3)。

  • 非重复值占比超过10%时会用比例表示,否则使用具体数字

       这一项由于仅抽样部分行,有时可能很不准确,可以手工指定列有多少非重复值

alter table tab_name alter column col_name set (n_distinct=xxx);

       如果表是有继承关系的其他子表的父表,还可以设置n_distinct_inherited,这样子表会继续使用这个父表的设置值。

alter table tab_name alter column col_name set (n_distinct_inherited=xxx);

3. 最频繁值 Most Common Values

pg_stats视图的most_common_vals 和 most_common_freqs字段。

SELECT most_common_vals AS mcv,left(most_common_freqs::text,60) || '...' AS mcf
FROM pg_stats
WHERE tablename = 'pgbench_branches' and attname='bbalance';

select bbalance,count(*) from pgbench_branches group by bbalance;

表示bbalance字段最频繁值是0和1,出现比率一个约71%,一个约28%

这个最常用于 column = value 的条件,例如

也适用于范围查询行数预估,本质上是一样的

4. 直方图

        如果distinct值太多,pg不可能一个个存起来,就会使用直方图保存。直方图的基本原理是将数据排序后分成若干个桶(bucket),并记录每个桶中数据的最大值、最小值、出现频次占比等信息。

 上面的bid是存了所有唯一值,下面aid就只用直方图存了部分值

最常见的直方图分为两类

  • 等宽直方图 Equi-width Histogram

       将数据按最大、小值区间等分为N,即所谓"等宽"。

假设某一列各个值的分布如下

划分为4个桶,则等宽直方图为

       优点是简洁清晰,缺点则是无法根据各值出现频率进行统计。如果桶中值偏差度过高,预估的返回行数可能差距会很大。

  • 等高直方图 Equi-depth Histogram

        将数据按总频次等分为N,每个桶中数值的频次之和为总行数的 1/N,即所谓"等高"。

       优点是增加选择率估算的准确性;且数据分散的区间内每个桶中的数值跨度更大,有利于减小储存直方图所消耗的内存。缺点是如果某个值占比极高,会导致它自己占很多个桶,其他大量值挤在一个桶中。

5. 非标准类型的统计信息

       most_common_elems,most_common_elem_freqs,elem_count_histogram 会显示非标准类型的元素的mcv,mcf,直方图信息,通常适用于数组、向量、范围等数据类型。

6. 平均宽度 avg_width

顾名思义,列中存储值的平均宽度,通常对变长的字符串类型比较有意义。

select avg_width FROM pg_stats where tablename='tmp002';

7. 相关度 Correlation

元组顺序与物理存储顺序。1表示完全一致,-1表示完全相反,越一致通常性能越好。

postgres=# create table test2(id int);
CREATE TABLE
postgres=# insert into test2 SELECT ceil(random() * 5) AS num FROM generate_series(1,5);
INSERT 0 5
postgres=# select * from test2;
 id 
----
  5
  2
  1
  4
  3
(5 rows)

postgres=# analyze test2;
ANALYZE
postgres=# select correlation from pg_stats where tablename  = 'test2';
 correlation 
-------------
        -0.2
(1 row)

       cluster命令可以对表进行进行聚簇,不过只对存量数据有效,增量数据无法保证,并且是8级锁,通常不会这样来用。

postgres=# create index on test2(id);
CREATE INDEX
postgres=# cluster test2 USING test2_id_idx ;
CLUSTER
postgres=# select * from test2;
 id 
----
  1
  2
  3
  4
  5
(5 rows)

postgres=# analyze test2;
ANALYZE
postgres=#  select correlation from pg_stats where tablename  = 'test2';
 correlation 
-------------
           1
(1 row)

四、 表达式统计信息

1. 直接为表达式收集统计信息

       当条件是表达式时(function-call = constant),pg给它预估的返回行占比总是0.5%,这可能会非常不准确。例如下面这个例子,条件是month,而最多只有12个月,因此占比预估约为1/12.

 因此,pg引入了作为扩展的表达式统计信息,用法有点类似函数索引。

CREATE STATISTICS flights_expr ON (extract(
month FROM scheduled_departure AT TIME ZONE 'Europe/Moscow'
))
FROM flights;

       扩展统计信息存在pg_statistic_ext系统表中,收集的数据单独存在pg_statistic_ext_data表中,而表达式统计信息可以在pg_stats_ext_exprs视图中查到。

2. 为表达式索引收集统计信息

另一个方法是为表达式创建索引,并对该索引收集统计信息(在pg_stats中查询)

CREATE INDEX ON flights(extract(month FROM scheduled_departure AT TIME ZONE 'Europe/Moscow'));
ANALYZE flights;

五、 多元统计信息 multivariate statistics

       类似oracle,这是为了解决列之间的相关性问题(correlated predicates)。一个经典案例是问出生在9月并且是处女座的人有多少,如果将两列当作毫无关系,预估值就会大大降低。

CREATE STATISTICS flights_dep(dependencies)
ON flight_no, departure_airport FROM flights;

        在pg 14中,不仅可以为多列创建扩展统计信息,还可以为多个表达式列也创建统计信息。

参考

《Postgresql修炼之道:从小工到专家(第二版)》

深度剖析PostgreSQL中的统计信息

PostgreSQL学习篇13.1 统计信息的收集_在路上-CSDN博客_postgresql 收集统计信息

PostgreSQL中的统计信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 周赛 351(2023/06/25)T2 有点意思

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 往期回顾:LeetCode 单周赛第 348 场 数位 DP 模版学会了吗? T1. 美丽下标对的数目(Easy) 标签&am…

python爬虫并做可视化分析--前程无忧

一.数据采集 1.采集逻辑 2.数据schema 招聘信息Schema { "岗位名称": "财务会计主管", "薪资":"1.3-2万", "地址": "*******", "经验要求": "5-7年", "公司名": "***…

JDK8新特性-上部

文章目录 一、Java发展史1.1 发展史1.2 OpenJDK和OracleJDK1.3 Open JDK 官网介绍 二、Lambda表达式2.1 需求分析2.2 Lamada表达式的体验2.3 Lambda表达式的语法规则2.3.1 Lambda表达式练习2.3.2 Lambda表达式练习 2.4 Lambda表达式的使用前提2.5 FunctionalInterface注解2.6 L…

MATLAB | 如何使用MATLAB获取顶刊《PNAS》绘图(附带近3年图像)

千呼万唤始出来,《PNAS》绘图获取的代码来啦,不过这次研究了半天也没想到如何获取付费文章的绘图,就只下载了免费文章(主要也怕侵权),不过光免费文章的图片三年了也有接近1.7w张了,同时使用代码下载时依旧需要科学上网…

【Redis】Redis的数据结构

【Redis】Redis的数据结构 文章目录 【Redis】Redis的数据结构1. 动态字符串SDS2. IntSet2.1 IntSet升级 3. Dict3.1 Dict的扩容3.2 Dict的收缩3.3 Dict的rehash 4. ZipList4.1 ZipList中的Entry4.1.1 Encoding编码 4.2 ZipList的连锁更新问题4.3 特性 5. QuickList 1. 动态字符…

【软考网络管理员】2023年软考网管初级常见知识考点(7)-生成树协议

涉及知识点 STP的原理,端口的状态,RSTP协议,MSTP协议,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学轻声码》,更多考点汇总可…

模拟电路系列分享-运放的关键参数2

目录 概要 整体架构流程 技术名词解释 1.输入偏置电流: 2.输入失调电流 技术细节 总结; 概要 提示:这里可以添加技术概要 实际运放与理想运放具有很多差别。理想运放就像一个十全十美的人,他学习100 分,寿命无限长,长…

Modal对话框(antd-design组件库)展示所有配置选项和onChange的作用

1.Modal对话框 模态对话框。 2.何时使用 需要用户处理事务,又不希望跳转页面以致打断工作流程时,可以使用 Modal 在当前页面正中打开一个浮层,承载相应的操作。 另外当需要一个简洁的确认框询问用户时,可以使用 App.useApp 封装的…

创建微信小程序的几种方式

创建微信小程序的几种方式 1. 使用原生方式 在官网上下载微信开发者工具,之后使用微信开发者工具新建项目即可。 微信这边提供了多个模板,可以直接下载模板快速搭建上线,也可以使用空白模板根据需求自行编写。 空白模板项目结构&#xff1…

C语言:打印0-100000中的自幂数(水仙花数是其中一种)

题目: 求出 0~100000 之间的所有 自幂数 并输出。 自幂数是指一个n位数,其各位数字的n次方之和恰好等于该数本身, 如:153=1^3+5^3+3^3, 则153是一个自幂数。 思路: 总体…

【数据网格架构】分布式数据网格作为集中式数据单体的解决方案

企业数据架构师不应构建大型集中式数据平台,而应创建分布式数据网格。 ThoughtWorks 的首席技术顾问 Zhamak Dehghani 在旧金山 QCon 的演讲和相关文章中表示,这种方法的改变需要范式转变。随着数据变得越来越普遍,传统的数据仓库和数据湖架构…

Linux基础+命令操作+mysql、tomcat、nginx、RabbitMQ、Redis,ElasticSearch

配置代理 一、永久设置 //编辑配置文件 vi /etc/profile //在该配置文件的最后添加代理配置 export http_proxyhttp://f1336515:password10.137.255.169:3128 //代理服务器ip地址和端口号 export https_proxyhttp://f1336515:password10.137.255.169:3128 //代理服务器ip…

【软考网络管理员】2023年软考网管初级常见知识考点(11)-TCP和UDP详解

涉及知识点 传输控制协议TCP是什么,三次握手的概念理解,用户数据报协议UDP是什么,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学轻声码》&#xff0…

AntV G6新版源码浅析

前言 AntV是蚂蚁金服全新一代数据可视化解决方案,其中G6主要用于解决图可视领域相关的前端可视化问题,其是一个简单、易用、完备的图可视化引擎。本文旨在通过简要分析G6 5.x版本源码来对图可视领域的一些底层引擎进行一个大致了解,同时也为…

【玩转Linux操作】详细讲解expr,read,echo,printf,test,[]等命令

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【free loop】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 文章目录 🍔expr命令⭐表达式说明 &#x1f3…

JAVA:Springboot动态装配Druid多数据源

1、简介 最近打算搭建一个鉴权中心服务,采用springbootFastMybatis装配Druid,考虑后续拓展采用Druid多数据源配置,以一个数据源为主,多个动态数据源为辅的结构。除了数据库,后续会结合shiro安全框架来搭建。 2、引用…

【Leetcode60天带刷】day33回溯算法——1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

​ 题目: 1005. K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&am…

将视频转为幻灯片图像:利用OpenCV实现视频资料转换的指南

视频成为了传播知识和信息的重要媒介之一。然而,有时我们需要以静态的形式保存视频内容,例如将视频讲座转换为幻灯片或图像,以便于分享、存档或打印。幸运的是,OpenCV这一功能强大的计算机视觉库提供了各种技术和工具,…

机器学习之线性回归算法

目录 线性回归算法 求导法推导 梯度下降法推导 线性回归实现人脸识别 导入数据 构建标签矩阵 经典线性回归求导法实现 经典线性回归梯度下降法实现 岭回归实现 套索回归实现 局部加权线性回归实现 可视化 人脸识别 线性回归算法 求导法推导 梯度下降法推导 线性回…

chatgpt赋能python:Title:Python编程中的空格怎么用?详细教程!

Title: Python编程中的空格怎么用?详细教程! Introduction: Python编程的空格使用一直是令人困惑的话题之一,但它却是Python语言中非常重要的一部分。空格在Python程序中用来表示代码块的开始和结束,因此不同的空格使用方式可能…