通过统计信息的相关指标您可以了解数据库整体的使用情况,例如SQL语句、表、索引以及后台进程的相关信息等等。通过这些信息您可以评估当前数据库中可以优化的地方,这些统计信息就类似一份体检报告,告诉您哪里存在问题,哪里需要进行调整。

PolarDB统计信息

pg_stat_database

列名 示例值 说明
datid 13510 数据库OID
datname postgres 数据库名
numbackends 98 访问当前数据库连接数量
xact_commit 14291309 该数据库事务提交总量
xact_rollback 0 该数据库事务回滚总量
blks_read 536888 总磁盘物理读的块数
blks_hit 261717850 在shared_buffer命中的块数
tup_returned 58521416 对于表来说是全表扫描的行数,对于索引是通过索引方法返回的索引行数,如果这个值数量明显大于tup_fetched,说明当前数据库存在大量全表扫描的情况。
tup_fetched 57193639 指通过索引返回的行数
tup_inserted 14293061 插入的行数
tup_updated 42868451 更新的行数
tup_deleted 98 删除的行数
conflicts 0 与恢复冲突取消的查询次数(只会在备库上发生)
temp_files 0 产生临时文件的数量,如果这个值很高说明work_mem需要调大
temp_bytes 0 产生临时文件的大小
deadlocks 0 死锁的数量,如果这个值很大说明业务逻辑有问题。
blk_read_time 0 数据库中花费在读取文件的时间,这个值较高说明内存较小,需要频繁的从磁盘中读入数据文件。
blk_write_time 0 数据库中花费在写数据文件的时间
stats_reset 2019/11/9 14:06

性能监控中的TPS和扫描行数的相关信息是从pg_stat_database中获取的,从以下两个视图中可以简单看出数据库的基本使用状态,对于一些明显负载的变化可以很清楚的进行定位,如何打开性能监控页面请参见性能监控

TPS-1TPS-2

pg_stat_user_tables

列名 示例值 说明
relid 16390 表的OID
schemaname public 模式名称
relname pgbench_accounts 表名
seq_scan 0 这个表进行全表扫描的次数
seq_tup_read 0 全表扫描的数据行数,如果这个值很大说明对这个表进行SQL很有可能都是全表扫描。
idx_scan 29606482 索引扫描的次数
idx_tup_fetch 29606482 通过索引扫描返回的行数
n_tup_ins 0 插入的数据行数
n_tup_upd 14803241 更新的数据行数
n_tup_del 0 删除的数据行数
n_tup_hot_upd 14638544 hot update的数据行数,这个值与n_tup_upd越接近说明update的性能较好,更新数据时不会更新索引。
n_live_tup 100012319 活着的行数量
n_dead_tup 2403437 死亡的行数量
n_mod_since_analyze 0 这个表最后一次被分析后被修改的行的估计数量
last_vacuum 上次手动vacuum的时间
last_autovacuum 上次autovacuum的时间
last_analyze 上次analyze的时间
last_autoanalyze 2019/4/9 14:12 上次自动analyze的时间
vacuum_count 0 vacuum的次数
autovacuum_count 0 autovacuum的次数
analyze_count 0 analyze的次数
autoanalyze_count 1 自动analyze的次数
  • seq_scan、seq_tup_read的值很高说明该表有大量的全表扫描动作,您需要找到问题SQL进行优化。
  • n_dead_tup的值很高说明该表有大量的UPDATE和DELETE操作,产生了大量的垃圾数据,您需要对该表进行vacuum动作,同时表明autovacuum参数设置也不够合理需要您进行调整。遇到类似情况您可以手动执行vacuum table操作或调整autovacuum参数触发自动vacuum动作。

pg_stat_user_indexes

列名 示例值 说明
relid 16390 表的OID
indexrelid 16404 索引的OID
schemaname public 模式名
relname pgbench_accounts 表名
indexrelname pgbench_accounts_pkey 索引名
idx_scan 29606482 通过索引扫描的次数,如果这个值很小,说明这个索引很少被用到,可以考虑进行删除。
idx_tup_read 29949698 通过任意索引方法返回的索引行数
idx_tup_fetch 29606482 通过索引方法返回的数据行数

通过pg_stat_user_indexes可以知道当前数据库中哪些是用的很频繁的索引,哪些是无效索引,无效索引可以进行删除,可以减少磁盘空间的使用和提升INSERT,UPDATE,DELETE性能。

pg_statio_user_tables

列名 示例值 说明
relid 16390 表的OID
schemaname public 模式名
relname pgbench_accounts 表名
heap_blks_read 414012 从磁盘中读入表的块数
idx_heap_blks_hit 44710713 指在shared_buffer中命中表的块数
idx_blks_read 67997 从磁盘中读入索引的块数
idx_blks_hit 89424015 在shared_buffer中命中的索引的块数
toast_blks_read 从磁盘中读入toast表的块数
toast_blks_hit 指在shared_buffer中命中toast表的块数
tidx_blks_read 从磁盘中读入toast表索引的块数
tidx_blks_hit 指在shared_buffer中命中toast表索引的块数

pg_stat_bgwriter

列名 示例值 说明
checkpoints_timed 1050 指超过checkpoint_timeout的时间后触发的检查点。
checkpoints_req 1 指手动触发的检查点或者因为wal文件数量到达max_wal_size大小时也会增加。
checkpoint_write_time 659728 指从shared_buffer中write到磁盘的时间。
checkpoint_sync_time 549 指checkpoint调用fsync将脏数据同步到磁盘花费的时间。
buffers_checkpoint 122383 checkpoint写入的脏块的数量
buffers_clean 60723 通过bgwriter写入的块的数量
maxwritten_clean 583 指bgwriter单次写入超过bgwriter_lru_maxpages时停止的次数。
buffers_backend 306521 通过backend写入的块数量
buffers_backend_fsync 0 指backend需要fsync的次数
buffers_alloc 317113 被分配的缓冲区数量
stats_reset 2019-03-28 16:54:45 统计重置的时间

通过pg_stat_bgwriter视图可以判断checkpoint以及max_wal_size的相关参数是否合理。也可以判断bgwriter相关的参数是否合理。

pg_stat_statements

列名 示例值 说明
userid 10 用户ID
dbida 12917 数据库OID
queryid 4390283800491518311 SQL进行归一化后的HASH值
query select version() SQL归一化后的内容
calls 1 执行次数
total_time 0.208 SQL总共的执行时间
min_time 0.208 SQL最小的执行时间
max_time 0.208 SQL最大的执行时间
mean_time 0.208 SQL平均的执行时间
stddev_time 0 在该语句中花费时间的总体标准偏差,以毫秒计
rows 1 SQL返回或者影响的行数
shared_blks_hit 0 SQL在shared_buffer中命中的块数
shared_blks_read 0 从磁盘中读取的块数
shared_blks_dirtied 0 SQL语句弄脏的shared_buffer的块数
shared_blks_written 0 SQL语句写入的块数
local_blks_hit 0 临时表中命中的块数
local_blks_read 0 临时表需要读的块数
local_blks_dirtied 0 临时表弄脏的块数
local_blks_written 0 临时表写入的块数
temp_blks_read 0 从临时文件读取的块数
temp_blks_written 0 从临时文件写入的数据块数
blk_read_time 0 从磁盘读取花费的时间
blk_write_time 0 从磁盘写入花费的时间

pg_stat_activity

列名 示例值 说明
datid 12630 后端连接到的数据库OID
datname postgres 后端连接的数据库的名称
pid 19239 后端的进程 ID
usesysid 10 登录到后端的用户的OID
usename postgres 登录到后端的用户的名称。
application_name psql 连接到后端的应用的名称
client_addr 连接到后端的客户端的IP地址
client_hostname 已连接的客户端的主机名
client_port -1 客户端和后端通信的TCP端口号
backend_start 2020-02-22 18:52:16 进程被启动的时间
xact_start 2020-02-23 15:25:46 进程的当前事务被启动的时间
query_start 2020-02-23 15:25:46 当前活动查询被开始的时间
state_change 2020-02-23 15:25:46 状态(state)上一次被改变的时间
wait_event_type 会话的等待事件类型
wait_event 具体的等待事件名称
state active 后端会话状态:active,idle,idle in transaction, idle in transaction (aborted)。
backend_xid 后端的事务标识符
backend_xmin 1089 后端的xmin范围
query select 1; 查询的SQL
backend_type client backend autovacuum launcher、autovacuum worker、client backend、checkpointer等

pg_locks

列名 示例值 说明
locktype relation 可锁对象的类型:relation、extend,page、tuple、transactionid、virtualxid、object、userlock或advisory
database 12630 锁目标存在的数据库的OID,如果目标是一个共享对象则为0,如果目标是一个事务ID则为空。
relation 11645 锁目标的关系的OID,如果目标不是一个关系或者只是关系的一部分则此列为空。
page 锁目标的页在关系中的页号,如果目标不是一个关系页或元组则此列为空。
tuple 锁目标的元组在页中的元组号,如果目标不是一个元组则此列为空。
virtualxid 锁目标的事务虚拟ID,如果目标不是一个虚拟事务ID则此列为空。
transactionid 锁目标的事务ID,如果目标不是一个事务ID则此列为空ID。
classid 包含锁目标的系统目录的OID,如果目标不是一个普通数据库对象则此列为空。
objid 锁目标在它的系统目录中的OID,如果目标不是一个普通数据库对象则为空。
objsubid 锁的目标列号
virtualtransaction 3/220 保持这个锁或者正在等待这个锁的事务的虚拟ID。
pid 19239 保持这个锁或者正在等待这个锁的服务器进程的PID。
mode AccessShareLock 此进程已持有或者希望持有的锁模式。
granted t 此进程已持有或者希望持有的锁模式。
fastpath t 如果锁通过快速路径获得则为真,通过主锁表获得则为假。