PostgreSQL 性能检测
数据库统计信息概览
pg_stat_user_tables
- relid:表的标识符。
- schemaname:表所属的模式名称。
- relname:表的名称。
- seq_scan:顺序扫描表的次数。
- seq_tup_read:从表中读取的行数(通过顺序扫描)。
- idx_scan:索引扫描表的次数。
- idx_tup_fetch:从索引中检索的行数。
- n_tup_ins:向表中插入的行数。
- n_tup_upd:更新表中的行数。
- n_tup_del:从表中删除的行数。
- n_tup_hot_upd:热更新的行数,即在同一页上进行的更新操作。
- n_live_tup:表中当前存活的行数。
- n_dead_tup:表中当前已删除的行数。
- last_vacuum_time:上次执行 VACUUM 操作的时间。
- last_autovacuum_time:上次自动执行 VACUUM 操作的时间。
- vacuum_count:执行 VACUUM 操作的次数。
- autovacuum_count:自动执行 VACUUM 操作的次数。
SELECT *
FROM pg_stat_all_tables
WHERE schemaname = current_schema() and idx_scan < seq_scan ORDER BY seq_scan DESC;
--查看表的行数大小排序
SELECT relname, n_live_tup
FROM pg_stat_user_tables
order by n_live_tup desc
通过查询pg_stat_user_tables,可以基本清楚哪些表的全表扫描的次数较多,表中是插入还是更新,删除比较多。也可以了解当前表中垃圾数据的数量。
查看索引使用记录
在 PostgreSQL 中,pg_stat_all_indexes
和 pg_stat_user_indexes
是两个系统视图,用于提供关于索引的统计信息。这些视图存储了有关数据库中各个索引的性能统计数据。
-
pg_stat_all_indexes:这个系统视图包含了所有用户和系统表的索引的统计信息。它会为每个索引提供详细的指标,如扫描次数、插入次数、更新次数、删除次数等。这些统计信息可以用于分析索引的使用情况和效果,以帮助优化查询性能。
-
pg_stat_user_indexes:这个系统视图只包含当前数据库用户所拥有的索引的统计信息。它提供了与 pg_stat_all_indexes 相同的指标,但仅针对当前用户的索引进行统计。通过查看这个视图,用户可以更方便地获取与自己相关的索引的性能数据。
这两个视图都具有相似的列,包括索引名称、表名称、扫描次数、插入次数、更新次数、删除次数等。通过查询这些视图,你可以获取有关索引使用情况的信息,以便评估索引的效率,发现潜在的性能问题,并进行索引优化和调整。
- indexrelname:索引的名称。
- relname:表的名称。
- schemaname:表所在的模式名称。
- idx_scan:通过索引扫描的次数,如果这个值很小,说明这个索引很少被用到,可以考虑进行删除。
- idx_tup_read:通过任意索引方法返回的索引行数。
- idx_tup_fetch:通过索引方法返回的数据行数。
通过pg_stat_user_indexes可以知道当前数据库中哪些是用的很频繁的索引,哪些是无效索引,无效索引可以进行删除,可以减少磁盘空间的使用和提升insert,update,delete性能。
pg_statio_user_tables
- relid:表的标识符(OID)。
- schemaname:表所属的模式名称。
- relname:表的名称。
- heap_blks_read:从磁盘读取到的堆块数量。
- heap_blks_hit:从缓存中读取的堆块数量。
- idx_blks_read:从磁盘读取到的索引块数量。
- idx_blks_hit:从缓存中读取的索引块数量。
- toast_blks_read:从磁盘读取到的 TOAST 块数量。
- toast_blks_hit:从缓存中读取的 TOAST 块数量。
- tidx_blks_read:从磁盘读取到的 TOAST 索引块数量。
- tidx_blks_hit:从缓存中读取的 TOAST 索引块数量。
如果heap_blks_read,idx_blks_read很高说明shared_buffer较小,存在频繁需要从磁盘或者page cache读取到shared_buffer中。
pg_stat_bgwriter
- checkpoints_timed:定时检查点的数量。
- checkpoints_req:请求检查点的数量。
- buffers_checkpoint:检查点期间写入磁盘的缓冲区数量。
- buffers_clean:后台写进程清理的缓冲区数量。
- maxwritten_clean:单个后台写进程最近清理的块数。
- buffers_backend:后台写进程由后端进程完全清空的缓冲区数量。
- buffers_alloc:后台写进程分配的新缓冲区数量。
这些列提供了有关后台写进程的各种指标,可以用于监控和优化 PostgreSQL 的 IO 性能。通过分析这些统计信息,可以了解缓存管理策略的效果、磁盘 IO 负载情况等方面的情况。
表大小查询
select
relname,
pg_size_pretty(pg_relation_size(relid))
from
pg_stat_user_tables
where
schemaname = 'public'
order by
pg_relation_size(relid) desc;
索引大小查询
SELECT
indexrelid::regclass AS index_name,
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
FROM
pg_index
order by
pg_relation_size(indexrelid) desc;
pg_catalog.f_pg_stat_activity()
pg_stat_activity 视图是 PostgreSQL 中的系统视图之一,用于获取当前数据库中正在活动的会话信息。它提供了与活动连接相关的有用信息,如会话 ID、用户名、客户端地址、查询语句等。
查看表空间大小(总大小,索引,数据)
SELECT table_name,
pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS total_size,
pg_size_pretty(pg_indexes_size('"' || table_schema || '"."' || table_name || '"')) AS index_size,
pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') - pg_indexes_size('"' || table_schema || '"."' || table_name || '"')) AS data_size
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;
SELECT relname, n_live_tup
FROM pg_stat_user_tables
order by n_live_tup desc
查看库空间大小
SELECT datname AS "Database Name",
pg_size_pretty(pg_database_size(datname)) AS "Size"
FROM pg_database;