写点什么

一文读懂数仓中的 pg_stat

  • 2022 年 7 月 07 日
  • 本文字数:4896 字

    阅读完需:约 16 分钟

一文读懂数仓中的pg_stat

本文分享自华为云社区《一文读懂pgstat》,作者: leapdb 。


GaussDB(DWS)在 SQL 执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中。


这些信息可以通过 “pg_stat_all_tables 视图” 查询,也可以通过下面函数进行查询。


pg_stat_get_tuples_inserted   --表累积insert条数pg_stat_get_tuples_updated    --表累积update条数pg_stat_get_tuples_deleted    --表累积delete条数pg_stat_get_tuples_changed    --表自上次analyze以来,修改的条数pg_stat_get_last_analyze_time --查询最近一次analyze时间
复制代码


因此,根据共享内存中 “表自上次 analyze 以来修改过的条数” 是否超过一定阈值,就可以判定是否需要做 analyze 了。

1. 事务中如何记录统计信息


每个 session 有一个 PgStat_TableStatus 内存结构,当前事务访问过的每个表占用一个。


其中包含每一层子事务的统计信息,用结构体 PgStat_TableXactStatus 描述。这里记录了当前子事务增删改查的各种信息。


pg_stat_get_xact_numscans --当前事务在当前表上,启动顺序扫描的次数pg_stat_get_xact_tuples_returned --当前事务在当前表上,顺序扫描抓取的可见元组条数。pg_stat_get_xact_tuples_fetched --当前事务在当前表上,抓取的可见元组条数。pg_stat_get_xact_tuples_inserted --当前事务在当前表上,插入条数pg_stat_get_xact_tuples_deleted --当前事务在当前表上,删除条数pg_stat_get_xact_tuples_updated --当前事务在当前表上,更新条数pg_stat_get_xact_tuples_hot_updated --当前事务在当前表上,HOT更新条数pg_stat_get_xact_blocks_fetched --当前事务在当前表上,选中的页面数pg_stat_get_xact_blocks_hit --当前事务在当前表上,扫描过的页面数pg_stat_get_xact_function_calls --当前事务在当前函数上,调用次数pg_stat_get_xact_function_total_time --当前事务在当前函数上,所有调用的总执行时间pg_stat_get_xact_function_self_time --当前事务在当前函数上,上次调用一次的执行时间pg_stat_get_xact_partition_tuples_inserted --当前事务在当前表分区上,插入条数pg_stat_get_xact_partition_tuples_deleted --当前事务在当前表分区上,删除条数pg_stat_get_xact_partition_tuples_updated --当前事务在当前表分区上,更新条数pg_stat_get_xact_partition_tuples_hot_updated --当前事务在当前表分区上,HOT更新条数
复制代码


事务提交时会把当前表,所有子事务中的信息汇总,并转储到 pgstat 中。

2. 事务外如何记录统计信息


事务提交时将事务中的执行信息通过 UDP 报文发送给 PgCollector 后台线程,由其记录到统一的内存中,并在集群正常停止时转储到物理文件 pg_stat_tmp/pgstat.stat 中。


  • 实例级信息,PgStat_GlobalStats

  • 库级信息,PgStat_StatDBEntry

  • 表级信息,其内存结构 PgStat_StatTabEntry


--实例级信息pg_stat_get_bgwriter_timed_checkpoints --后台写进程开启定时检查点的次数pg_stat_get_bgwriter_requested_checkpoints --后台写进程开启基于后端请求的检查点的次数pg_stat_get_checkpoint_write_time --最近一次checkpoint写页面的时间pg_stat_get_checkpoint_sync_time --最近一次checkpoint同步页面的时间pg_stat_get_bgwriter_buf_written_checkpoints --在检查点期间后台写进程写入的缓冲区数目。pg_stat_get_bgwriter_buf_written_clean --为日常清理脏块,后台写进程写入的缓冲区数目。pg_stat_get_bgwriter_maxwritten_clean --后台写进程停止清理扫描的时间,因为已经写入了更多的缓冲区(相比bgwriter_lru_maxpages参数声明的缓冲区数)。pg_stat_get_buf_written_backend --后端进程写入的缓冲区数,因为它们需要分配一个新的缓冲区。pg_stat_get_buf_fsync_backend --后台进程执行fsync的次数pg_stat_get_buf_alloc --分配的总缓冲区数。pg_stat_get_bgwriter_stat_reset_time --后台bgwriter线程的重置时间
--当前CN记录的库级信息pg_stat_get_db_xact_commit --当前实例上指定数据库中已提交事务的数量。pg_stat_get_db_xact_rollback --当前实例上指定数据库中回滚事务的数量。pg_stat_get_db_blocks_fetched --当前实例上指定数据库中磁盘块抓取请求的数量。pg_stat_get_db_blocks_hit --当前实例上指定数据库在缓冲区中找到的请求磁盘块的数量。pg_stat_get_db_tuples_returned --当前实例上指定数据库返回的元祖数量。pg_stat_get_db_tuples_fetched --当前实例上指定数据库中读取的元组数量。pg_stat_get_db_tuples_inserted --当前实例上指定数据库中插入的元组数量。pg_stat_get_db_tuples_updated --当前实例上指定数据库中更新的元组数量。pg_stat_get_db_tuples_deleted --当前实例上指定数据库中删除的元组数量。pg_stat_get_db_conflict_all --当前实例上指定数据库中发生冲突恢复的次数。pg_stat_get_db_conflict_lock --集群中所有CN和DN上指定数据库锁冲突的总数。在DN上执行该函数,返回当前实例上指定数据库中锁冲突数量。pg_stat_get_db_deadlocks --当前实例上指定数据库中死锁的数量。pg_stat_get_db_temp_files --当前实例上指定数据库中创建临时文件的个数。pg_stat_get_db_temp_bytes --当前实例上指定数据库中创建临时文件的字节数。pg_stat_get_db_blk_read_time --当前实例上指定数据库中读数据块所用的时间。pg_stat_get_db_blk_write_time --当前实例上指定数据库中写数据块所用的时间。
--整个集群记录的库级信息pg_stat_get_db_total_xact_commit --在CN上执行该函数,返回集群中所有CN上指定数据库中已提交事务的总数。在DN上执行该函数,返回当前实例上指定数据库中已提交事务的数量。pg_stat_get_db_total_xact_rollback --在CN上执行该函数,返回集群中所有CN上指定数据库中回滚事务的总数。在DN上执行该函数,返回当前实例上指定数据库中回滚事务的数量。pg_stat_get_db_total_blocks_fetched --在CN上执行该函数,返回集群中所有DN上指定数据库中磁盘块抓取请求的总数。在DN上执行该函数,返回当前实例上指定数据库中磁盘块抓取请求的数量。pg_stat_get_db_total_blocks_hit --在CN上执行该函数,返回集群中所有DN上指定数据库在缓冲区中找到的请求磁盘块的总数。在DN上执行该函数,返回当前实例上指定数据库在缓冲区中找到的请求磁盘块的数量。pg_stat_get_db_total_tuples_returned --在CN上执行该函数,返回集群中所有DN上指定数据库返回的元组总数。在DN上执行该函数,返回当前实例上指定数据库返回的元组数量。pg_stat_get_db_total_tuples_fetched --在CN上执行该函数,返回集群中所有DN上指定数据库读取的元组总数。在DN上执行该函数,返回当前实例上指定数据库读取的元组数量。pg_stat_get_db_total_tuples_inserted --在CN上执行该函数,返回集群中所有DN上指定数据库插入的元组总数。在DN上执行该函数,返回当前实例上指定数据库插入的元组数量。pg_stat_get_db_total_tuples_updated --在CN上执行该函数,返回集群中所有DN上指定数据库更新的元组总数。在DN上执行该函数,返回当前实例上指定数据库更新的元组数量。pg_stat_get_db_total_tuples_deleted --在CN上执行该函数,返回集群中所有DN上指定数据库删除的元组总数。在DN上执行该函数,返回当前实例上指定数据库删除的元组数量。pg_stat_get_db_total_conflict_all --在CN上执行该函数,返回集群中所有CN和DN上指定数据库发生冲突恢复的总次数。在DN上执行该函数,返回当前实例上指定数据库中发生冲突恢复的次数。pg_stat_get_db_total_temp_files --在CN上执行该函数,返回集群中所有DN上指定数据库中创建临时文件的总个数。在DN上执行该函数,返回当前实例上指定数据库中创建临时文件的个数。pg_stat_get_db_total_temp_bytes --在CN上执行该函数,返回集群中所有DN上指定数据库中创建临时文件的总字节数。在DN上执行该函数,返回当前实例上指定数据库中创建临时文件的字节数。pg_stat_get_db_total_deadlocks --集群中所有CN和DN上指定数据库死锁的总数。在DN上执行该函数,返回当前实例上指定数据库中死锁的数量。pg_stat_get_db_total_blk_read_time --在CN上执行该函数,返回集群中所有DN上指定数据库中读数据块所用的总时间。在DN上执行该函数,返回当前实例上指定数据库中读数据块所用的时间。pg_stat_get_db_total_blk_write_time --在CN上执行该函数,返回集群中所有DN上指定数据库中写数据块所用的总时间。在DN上执行该函数,返回当前实例上指定数据库中写数据块所用的时间。
--表级信息pg_stat_get_numscans --当前表上,启动顺序扫描的次数pg_stat_get_tuples_returned --当前表上,顺序扫描抓取的可见元组条数。pg_stat_get_tuples_fetched --当前表上,抓取的可见元组条数。pg_stat_get_tuples_inserted --当前表上,插入条数pg_stat_get_tuples_deleted --当前表上,删除条数pg_stat_get_tuples_updated --当前表上,更新条数pg_stat_get_tuples_hot_updated --当前表上,HOT更新条数pg_stat_get_blocks_fetched --当前表上,选中的页面数pg_stat_get_blocks_hit --当前表上,扫描过的页面数pg_stat_get_function_calls --当前函数上,调用次数pg_stat_get_function_total_time --当前函数上,所有调用的总执行时间pg_stat_get_function_self_time --当前函数上,上次调用一次的执行时间pg_stat_get_partition_tuples_inserted --当前表分区上,插入条数pg_stat_get_partition_tuples_deleted --当前表分区上,删除条数pg_stat_get_partition_tuples_updated --当前表分区上,更新条数pg_stat_get_partition_tuples_hot_updated --当前表分区上,HOT更新条数pg_stat_get_tuples_changed --当前表上自上一次analyze的历史累积变化量pg_stat_get_partition_tuples_changed --当前表分区上自上一次analyze的历史累积变化量pg_stat_get_partition_live_tuples --当前表分区上可见元组数pg_stat_get_partition_dead_tuples --当前表分区上删除元组数pg_stat_get_live_tuples --当前表上可见元组数pg_stat_get_last_vacuum_time --当前表上最近一次vacuum的时间pg_stat_get_last_data_changed_time --当前表上最近一次数据修改时间pg_stat_get_last_autovacuum_time --当前表上最近一次autovacuum时间pg_stat_get_last_autoanalyze_time --当前表上最近一次autoanalyze时间pg_stat_get_last_analyze_time --当前表上最近一次手动analyze时间
--local表示当前节点的信息pg_stat_get_local_tuples_updatedpg_stat_get_local_tuples_insertedpg_stat_get_local_tuples_hot_updatedpg_stat_get_local_tuples_deletedpg_stat_get_local_tuples_changedpg_stat_get_local_live_tuplespg_stat_get_local_last_autovacuum_timepg_stat_get_local_last_autoanalyze_timepg_stat_get_local_dead_tuplespg_stat_get_local_autovacuum_countpg_stat_get_local_autoanalyze_countpg_stat_get_local_analyze_status
复制代码


函数信息,PgStat_StatFuncEntry


pg_stat_get_function_calls --函数已被调用次数。pg_stat_get_function_total_time --该函数花费的总挂钟时间,以微秒为单位。包括花费在此函数调用上的时间。pg_stat_get_function_self_time --在当前事务中仅花费在此函数上的时间。不包括花费在调用函数上的时间。
复制代码

3. 单节点的统计信息


每个 CN 和 DN 节点,各自记录自己的统计信息。可以通过上面的函数分别查看。


另外,CN 在增删改的 SQL 执行结束时,将各个 DN 的返回条数信息记录到 CN 自己的 pgstat 结构中,构成了全局的统计信息。

4. 集群全局的统计信息


各个 CN 各自维护自己的 pgstat 信息,因此若想知道集群全局的,还需要向所有 CN 查询并汇总。

5. 统计信息的生命周期


pgstat 中的统计信息属于运行时信息,这些信息处于事务外,不严格保证数据一致性。


在数据库异常停止时会清空所有数据,正常停止会保留数据。

6. 统计信息的维护


这些信息在执行 SQL 时被自动记录,不需要人工进行维护。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
一文读懂数仓中的pg_stat_数据库_华为云开发者联盟_InfoQ写作社区