当前位置:网站首页>一文读懂数仓中的pg_stat
一文读懂数仓中的pg_stat
2022-07-07 12:33:00 【华为云开发者联盟】
摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中。这些信息可以通过 “pg_stat_all_tables视图” 查询,也可以通过下面函数进行查询。
本文分享自华为云社区《一文读懂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_updated
pg_stat_get_local_tuples_inserted
pg_stat_get_local_tuples_hot_updated
pg_stat_get_local_tuples_deleted
pg_stat_get_local_tuples_changed
pg_stat_get_local_live_tuples
pg_stat_get_local_last_autovacuum_time
pg_stat_get_local_last_autoanalyze_time
pg_stat_get_local_dead_tuples
pg_stat_get_local_autovacuum_count
pg_stat_get_local_autoanalyze_count
pg_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时被自动记录,不需要人工进行维护。
边栏推荐
- Verilog implementation of a simple legv8 processor [4] [explanation of basic knowledge and module design of single cycle implementation]
- 手里的闲钱是炒股票还是买理财产品好?
- Mrs offline data analysis: process OBS data through Flink job
- SAKT方法部分介绍
- PERT图(工程网络图)
- 用例图
- Leetcode——236. 二叉树的最近公共祖先
- First choice for stock account opening, lowest Commission for stock trading account opening, is online account opening safe
- SSRF vulnerability file pseudo protocol [netding Cup 2018] fakebook1
- Use day JS let time (displayed as minutes, hours, days, months, and so on)
猜你喜欢
Vmware 与主机之间传输文件
数据流图,数据字典
Details of redis core data structure & new features of redis 6
常用數字信號編碼之反向不歸零碼碼、曼徹斯特編碼、差分曼徹斯特編碼
XML文件的解析操作
2022PAGC 金帆奖 | 融云荣膺「年度杰出产品技术服务商」
Take you to master the three-tier architecture (recommended Collection)
libSGM的horizontal_path_aggregation程序解读
Assign a dynamic value to the background color of DataGrid through ivalueconverter
手把手教会:XML建模
随机推荐
requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement
Excellent open source system recommendation of ThinkPHP framework
Similarities and differences between switches and routers
IP address home location query full version
How to check the ram and ROM usage of MCU through Keil
C # switch pages through frame and page
Hands on Teaching: XML modeling
多商户商城系统功能拆解01讲-产品架构
Laravel form builder uses
The longest ascending subsequence model acwing 482 Chorus formation
Navigation — 这么好用的导航框架你确定不来看看?
CSMA/CD 载波监听多点接入/碰撞检测协议
[untitled]
Es log error appreciation -limit of total fields
【AI实战】应用xgboost.XGBRegressor搭建空气质量预测模型(二)
Clickhouse (03) how to install and deploy Clickhouse
Is the compass stock software reliable? Is it safe to trade stocks?
请问,如图,pyhon云函数提示使用了 pymysql模块,这个是怎么回事?
Use case diagram
Leetcode——236. The nearest common ancestor of binary tree