-- 查看表大小(不含索引)
SELECT pg_size_pretty(pg_relation_size('表名'));
-- 查看表大小(含索引和TOAST)
SELECT pg_size_pretty(pg_total_relation_size('表名'));
-- 查看所有表大小排序
SELECT
relname as table_name,
pg_size_pretty(pg_total_relation_size(relid)) as total_size,
pg_size_pretty(pg_relation_size(relid)) as data_size,
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as index_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
三、索引信息查询
3.1 查看索引
sql复制代码
-- 查看表的索引
\d 表名
-- 查看所有索引
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename, indexname;
-- 查看指定表的索引
SELECT
indexname,
indexdef
FROM pg_indexes
WHERE tablename = '表名';
3.2 索引使用情况
sql复制代码
-- 查看索引使用统计
SELECT
schemaname,
tablename,
indexname,
idx_scan as 索引扫描次数,
idx_tup_read as 读取元组数,
idx_tup_fetch as 获取元组数
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;
四、连接和会话信息
4.1 查看当前连接
sql复制代码
-- 查看当前连接数
SELECT count(*) FROM pg_stat_activity;
-- 查看详细连接信息
SELECT
pid,
usename as user,
datname as database,
client_addr as client_ip,
state,
query_start,
state_change,
query
FROM pg_stat_activity
WHERE state = 'active';
-- 查看最大连接数设置
SHOW max_connections;
4.2 终止连接
sql复制代码
-- 终止指定进程
SELECT pg_terminate_backend(pid);
-- 终止空闲连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle'
AND state_change < current_timestamp - INTERVAL '10' MINUTE;
五、性能监控查询
5.1 慢查询监控
sql复制代码
-- 查看当前正在运行的慢查询(执行超过5秒的)
SELECT
pid,
usename,
datname,
query,
now() - pg_stat_activity.query_start as duration,
state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 seconds'
AND state = 'active'
ORDER BY duration DESC;
-- 查看慢查询日志配置
SHOW log_min_duration_statement;
5.2 锁信息查询
sql复制代码
-- 查看当前锁信息
SELECT
pid,
locktype,
relation::regclass as table_name,
mode,
granted,
query
FROM pg_locks l
JOIN pg_stat_activity a ON l.pid = a.pid
WHERE NOT granted;
-- 查看被阻塞的查询
SELECT
blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_locks.pid = blocked_activity.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.database = blocked_locks.database
AND blocking_locks.relation = blocked_locks.relation
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_locks.pid = blocking_activity.pid
WHERE NOT blocked_locks.granted;
六、用户和权限查询
6.1 查看用户/角色
sql复制代码
-- 查看所有用户
\du
-- 或
SELECT
rolname as role_name,
rolsuper as superuser,
rolcreatedb as create_db,
rolcreaterole as create_role,
rolcanlogin as can_login
FROM pg_roles;
-- 查看当前用户
SELECT current_user;
6.2 查看权限
sql复制代码
-- 查看表的权限
SELECT
grantee,
table_schema,
table_name,
privilege_type
FROM information_schema.role_table_grants
WHERE table_name = '表名';
-- 查看用户的权限
SELECT
grantor,
grantee,
table_schema,
table_name,
privilege_type
FROM information_schema.role_table_grants
WHERE grantee = '用户名';
七、配置参数查询
7.1 查看配置参数
sql复制代码
-- 查看所有配置参数
SHOW ALL;
-- 查看特定参数
SHOW listen_addresses;
SHOW port;
SHOW shared_buffers;
SHOW work_mem;
SHOW maintenance_work_mem;
-- 查看配置文件和路径
SELECT name, setting FROM pg_settings WHERE category LIKE 'File Locations';
八、统计信息查询
8.1 表访问统计
sql复制代码
-- 查看表的访问统计
SELECT
relname as table_name,
seq_scan as 全表扫描次数,
seq_tup_read as 全表扫描读取行数,
idx_scan as 索引扫描次数,
idx_tup_fetch as 索引扫描获取行数,
n_tup_ins as 插入行数,
n_tup_upd as 更新行数,
n_tup_del as 删除行数
FROM pg_stat_user_tables
ORDER BY seq_scan DESC;
8.2 最常访问的表
sql复制代码
-- 查询最常访问的表
SELECT
schemaname,
tablename,
seq_scan + idx_scan as total_scan,
seq_scan,
idx_scan
FROM pg_stat_user_tables
ORDER BY total_scan DESC
LIMIT 10;
九、实用系统函数
sql复制代码
-- 当前时间
SELECT now();
SELECT current_timestamp;
-- 版本信息
SELECT version();
-- 当前事务ID
SELECT txid_current();
-- 执行计划分析
EXPLAIN SELECT * FROM 表名 WHERE 条件;
EXPLAIN ANALYZE SELECT * FROM 表名 WHERE 条件;
-- 清理统计信息
ANALYZE 表名;
-- 手动垃圾回收
VACUUM 表名;
VACUUM FULL 表名; -- 需要谨慎使用,会锁表