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

PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables

PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables

pg_stat_all_tables视图中记录有analyze信息,比如何时做的analyze、表元组个数(活元组、死元组)等。重启后发现该视图中表的统计信息重置不见了,发生了什么?

1、pg_stat_all_tables

先理解下该视图,该视图定义如下。从视图定义可以看到相关统计信息都是通过一系列函数获取的:

yzs=# \d+ pg_stat_all_tables视图 "pg_catalog.pg_stat_all_tables"栏位         |           类型           | 校对规则 | 可空的 | 预设 | 存储  | 描述
---------------------+--------------------------+----------+--------+------+-------+------relid               | oid                      |          |        |      | plain |schemaname          | name                     |          |        |      | plain |relname             | name                     |          |        |      | plain |seq_scan            | bigint                   |          |        |      | plain |seq_tup_read        | bigint                   |          |        |      | plain |idx_scan            | bigint                   |          |        |      | plain |idx_tup_fetch       | bigint                   |          |        |      | plain |n_tup_ins           | bigint                   |          |        |      | plain |n_tup_upd           | bigint                   |          |        |      | plain |n_tup_del           | bigint                   |          |        |      | plain |n_tup_hot_upd       | bigint                   |          |        |      | plain |n_live_tup          | bigint                   |          |        |      | plain |n_dead_tup          | bigint                   |          |        |      | plain |n_mod_since_analyze | bigint                   |          |        |      | plain |last_vacuum         | timestamp with time zone |          |        |      | plain |last_autovacuum     | timestamp with time zone |          |        |      | plain |last_analyze        | timestamp with time zone |          |        |      | plain |last_autoanalyze    | timestamp with time zone |          |        |      | plain |vacuum_count        | bigint                   |          |        |      | plain |autovacuum_count    | bigint                   |          |        |      | plain |analyze_count       | bigint                   |          |        |      | plain |autoanalyze_count   | bigint                   |          |        |      | plain |
视图定义:SELECT c.oid AS relid,n.nspname AS schemaname,c.relname,pg_stat_get_numscans(c.oid) AS seq_scan,pg_stat_get_tuples_returned(c.oid) AS seq_tup_read,sum(pg_stat_get_numscans(i.indexrelid))::bigint AS idx_scan,sum(pg_stat_get_tuples_fetched(i.indexrelid))::bigint + pg_stat_get_tuples_fetched(c.oid) AS idx_tup_fetch,pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins,pg_stat_get_tuples_updated(c.oid) AS n_tup_upd,pg_stat_get_tuples_deleted(c.oid) AS n_tup_del,pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd,pg_stat_get_live_tuples(c.oid) AS n_live_tup,pg_stat_get_dead_tuples(c.oid) AS n_dead_tup,pg_stat_get_mod_since_analyze(c.oid) AS n_mod_since_analyze,pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum,pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum,pg_stat_get_last_analyze_time(c.oid) AS last_analyze,pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze,pg_stat_get_vacuum_count(c.oid) AS vacuum_count,pg_stat_get_autovacuum_count(c.oid) AS autovacuum_count,pg_stat_get_analyze_count(c.oid) AS analyze_count,pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_countFROM pg_class cLEFT JOIN pg_index i ON c.oid = i.indrelidLEFT JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"])GROUP BY c.oid, n.nspname, c.relname;

我们以n_live_tup这一列为例,看下这个统计信息来自哪里。需要梳理下pg_stat_get_live_tuples函数:可以看到统计信息来自pg_stat_tmp/global.stat(由配置项pgstat_temp_directory控制,默认pg_stat_tmp)

b7af19428a960f8c4bf2a9873e0e4dcd.png

2、正常关闭服务

关闭服务前,统计信息文件位于pg_stat_tmp:

246f0a99db1d41f025180e3ac68e8b45.png

bd152ea5bd298804f4c8e4899ebb7e47.png

关闭服务后:统计信息文件移动到了pg_stat

ad56af9eb0241a5cf9f518c9f8bf328a.png

fd7d8020467c0fcd7bbc38b070389a64.png

3、再次正常启动服务

发现统计信息文件又移动到了,pg_stat_tmp。此时查看pg_stat_all_tables视图,发现统计信息是存在的:

80134335aa18f5cfb9dc3e1c528101af.png

为什么重启后统计信息并没有重置呢?

经分析,在崩溃重启恢复时,会将pg_stat_tmp和pg_stat目录都进行重置,此后重启成功后,因没有统计信息文件,就导致pg_stat_all_tables视图中的信息为空了

97a66742b315410ecf381577331e0725.png

相关文章:

  • Hibernate 脏检查和刷新缓存机制
  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
  • EMG肌肉信号处理合集 (一)
  • 【DP】mobiusp正在创作乐曲
  • ubuntu20.04配置OpenCV的C++环境
  • 深度学习之基于YoloV3杂草识别系统
  • GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件
  • 操作系统 应用题 例题+参考答案(考研真题)
  • 【Ambari】HDFS基于Ambari的常规运维
  • 基于C#实现赫夫曼树
  • ②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
  • Mysql并发时常见的死锁及解决方法
  • 【RTP】RTPSenderAudio::SendAudio
  • .Net6使用WebSocket与前端进行通信
  • C++类与对象(5)—流运算符重载、const、取地址
  • Golang-长连接-状态推送
  • HTTP那些事
  • HTTP请求重发
  • JavaScript创建对象的四种方式
  • Java超时控制的实现
  • Koa2 之文件上传下载
  • Python_OOP
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Shell编程
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Unix命令
  • 汉诺塔算法
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何进阶一名有竞争力的程序员?
  • 如何使用 JavaScript 解析 URL
  • 深度学习在携程攻略社区的应用
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 怎么将电脑中的声音录制成WAV格式
  • 06-01 点餐小程序前台界面搭建
  • 数据库巡检项
  • 整理一些计算机基础知识!
  • ​ubuntu下安装kvm虚拟机
  • #HarmonyOS:基础语法
  • #stm32整理(一)flash读写
  • (16)Reactor的测试——响应式Spring的道法术器
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (四)Controller接口控制器详解(三)
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .bat批处理(六):替换字符串中匹配的子串
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .htaccess配置常用技巧
  • .htaccess配置重写url引擎
  • .Net MVC4 上传大文件,并保存表单