postgresql信息统计分析

-----------------------------------------------------------------------------------------------------------
-- pg_stat
-----------------------------------------------------------------------------------------------------------
-- pg_stat_activity 查看当前运行的Postgres连接进程的情况,基本所有信息都有参考价值。
select * from pg_stat_activity where state <> 'idle' order by xact_start asc;


-- pg_stat_bgwriter 后台写进程的统计信息
-- 检查点的集中数据写入会对数据库IO的性能有很大的提升,但相应的需要部分空间存储脏数据,而且一旦数据库崩溃,内存中未被写入磁盘的脏数据越多,数据库恢复时间也就越长,这是一个数据库的平衡问题
-- show block_size;  -- 查看块大小
SELECT (100 * checkpoints_req) / (checkpoints_timed + checkpoints_req) AS checkpoints_req_pct,
pg_size_pretty(buffers_checkpoint * block_size / (checkpoints_timed + checkpoints_req)) AS avg_checkpoint_write,
pg_size_pretty(block_size * (buffers_checkpoint + buffers_clean + buffers_backend)) AS total_written,
100 * buffers_checkpoint / (buffers_checkpoint + buffers_clean + buffers_backend) AS checkpoint_write_pct,
100 * buffers_backend / (buffers_checkpoint + buffers_clean + buffers_backend) AS backend_write_pct,*
FROM pg_stat_bgwriter,(SELECT cast(current_setting('block_size') AS integer) AS block_size) AS bs;


-- pg_stat_user_tables 用户表 pg_stat_sys_tables 系统表 pg_stat_all_tables 所有表
-- 统计对一个表操作的偏重,insert update delete的比例
-- 同样维度的索引表 pg_stat_user_indexes 记录了索引的一些使用信息
SELECT relname,cast(n_tup_ins AS numeric) / (n_tup_ins + n_tup_upd + n_tup_del) AS ins_pct,
cast(n_tup_upd AS numeric) / (n_tup_ins + n_tup_upd + n_tup_del) AS upd_pct, 
cast(n_tup_del AS numeric) / (n_tup_ins + n_tup_upd + n_tup_del) AS del_pct 
FROM pg_stat_user_tables where relname='tbl_res';


-- pg_statio_user_indexes
-- 查询索引的命中率
-- 相对于表的大小来说,索引占用的空间要小的多,所以常用的表,可以让其索引一直存在内存中,很多时候保持索引的一个高命中率是非常必要的。
SELECT indexrelname,cast(idx_blks_hit as numeric) / (idx_blks_hit + idx_blks_read) AS hit_pct,
idx_blks_hit,idx_blks_read 
FROM pg_statio_user_indexes WHERE (idx_blks_hit + idx_blks_read)>0 ORDER BY hit_pct;


-- 关于pg_stat_all_indexes、pg_statio_all_indexes、pg_stat_all_tables、pg_statio_all_tables的字段解析
-- PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读
-- https://yq.aliyun.com/articles/8475


-- 表和索引扫描统计 pg_stat_all_indexes , pg_statio_all_indexes , pg_stat_all_tables ,pg_statio_all_tables 用法如下
A=pg_stat_all_tables.seq_scan,代表全表扫描次数   
   
B=pg_stat_all_tables.seq_tup_read,代表返回记录数   
   
C=pg_class.reltuples,代表表的记录数   
   
D=pg_class.relpages,代表表的大小(占用了多少数据块)   
   
E=pg_statio_all_tables.heap_blks_read + pg_statio_all_tables.heap_blks_hit,代表扫描了多少个堆表的数据块 
如果A很大,并且B/A很小,并且C较大或D较大,那么说明需要加索引。
如果E/A较大,并且D或C较大,那么说明需要加索引。
判断标准就是:
大表被全表扫描了很多数据块,并返回了少量记录

-- 客户端连接数
SELECT count(*) FROM pg_stat_activity WHERE NOT pid=pg_backend_pid();

-- 数据库占用空间
select pg_size_pretty(pg_database_size('postgres'));
-- 查询表大小
select pg_size_pretty(pg_relation_size('tbl_res'));


-- 锁信息查询 不方便直接查询阻塞引起者的信息,这个阻塞的锁类型有关,不同的锁类型查询方式不同。
-- pg_lock.lock_type有relation, extend, page, tuple, transactionid, virtualxid, object, userlock, 或 advisory 
select t1.locktype,t1.pid,t1.mode,t2.client_addr,t2.client_port,t2.xact_start,t2.query_start,t2.query 
from pg_locks t1 join pg_stat_activity t2 using (pid) where not granted;

-----------------------------------------------------------------------------------------------------------
-- 附加统计函数
-----------------------------------------------------------------------------------------------------------
-- 附加在pg_stat系列上的功能,针对性使用收集数据。
pg_backend_pid() -- 服务器进程处理当前会话的进程ID 
pg_stat_clear_snapshot() -- 丢弃当前数据库快照  
pg_stat_reset_single_table_counters(oid) -- 为当前数据库中单一表或者索引重置统计为零(需要超级用户权限)  
pg_stat_reset_single_function_counters(oid) -- 当前数据库中单一功能重置统计为零(需要超级用户权限)  


-----------------------------------------------------------------------------------------------------------
-- 扩展插件
-----------------------------------------------------------------------------------------------------------

-- pg_stat_statements 语句执行情况统计 按需求查询即可

-- pg_buffercache
-- create extension pg_buffercache ;
-- 表在共享内存中占用的块数,用来查看表是不是在内存中,buffers的单位是数据块,默认8K,如果计算大小等于表的大小,说明全表的数据都在缓存中,这时的查询速度是很快的
-- 这个插件查询起来比较慢,可能存在一些性能压力。
-- 使用事例如下 
SELECT c.relname, count(*) AS buffers 
FROM pg_buffercache b INNER JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid) 
AND b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) GROUP BY c.relname ORDER BY 2 DESC LIMIT 5;


-----------------------------------------------------------------------------------------------------------
-- 自带工具
-----------------------------------------------------------------------------------------------------------
-- 查看数据库基本状态信息 包含非常多的信息
-- /PGtest/postgres/pgsql/bin/pg_controldata -D /PGtest/pgdata/
pg_controldata

猜你喜欢

转载自blog.csdn.net/weixin_42767321/article/details/85164933