通过统计信息的相关指标您可以了解数据库整体的使用情况,例如SQL语句、表、索引以及后台进程的相关信息等等。通过这些信息您可以评估当前数据库中可以优化的地方,这些统计信息就类似一份体检报告,告诉您哪里存在问题,哪里需要进行调整。
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中获取的,从以下两个视图中可以简单看出数据库的基本使用状态,对于一些明显负载的变化可以很清楚的进行定位,如何打开性能监控页面请参见性能监控。
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 | 如果锁通过快速路径获得则为真,通过主锁表获得则为假。 |