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

文章探讨了pg_stat_all_tables视图中记录的analyze信息,包括表的统计数据。当服务正常关闭和重启后,统计信息如何在pg_stat_tmp和pg_stat目录间迁移,以及为何重启后视图中的信息可能消失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_count
   FROM pg_class c
     LEFT JOIN pg_index i ON c.oid = i.indrelid
     LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
  WHERE 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)

a442562ee7357b3bdbbaf0fa59d1bdae.png

2、正常关闭服务

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

ccfefd5ca36d264acc77f1f057b35670.png

499c2815db81f2c47a43eb5fc23d518f.png

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

0cd9bb4896a792acf6468a409996fa49.png

a441253fd434b3107746b35c8eca9641.png

3、再次正常启动服务

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

a2e8e397f4278bb836d95299ceb04f98.png

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

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

39d67f81e40f131e593de9f3334a6556.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzs87

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值