PostgreSQL 常用查询命令汇总
一、数据库信息查询
1.1 查看数据库列表
-- 查看所有数据库
\l
-- 或
SELECT datname FROM pg_database;
-- 查看当前数据库
SELECT current_database();
1.2 查看数据库大小
-- 查看当前数据库大小
SELECT pg_size_pretty(pg_database_size(current_database()));
-- 查看所有数据库大小
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
-- 查看具体数据库大小
SELECT pg_size_pretty(pg_database_size('数据库名'));
二、表信息查询
2.1 查看所有表
-- 查看当前schema中的所有表
\dt
-- 查看所有schema中的表
\dt *
-- 查看指定schema中的表
\dt schema_name.*
-- 使用SQL查询
SELECT schemaname, tablename
FROM pg_tables
WHERE schemaname NOT IN ('information_schema', 'pg_catalog');
2.2 查看表结构
-- 查看表结构
\d 表名
-- 查看表详细信息(包括索引、触发器、约束等)
\d+ 表名
-- 使用SQL查询列信息
SELECT
column_name,
data_type,
character_maximum_length,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_name = '表名';
2.3 查看表大小
-- 查看表大小(不含索引)
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 查看索引
-- 查看表的索引
\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 索引使用情况
-- 查看索引使用统计
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 查看当前连接
-- 查看当前连接数
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 终止连接
-- 终止指定进程
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 慢查询监控
-- 查看当前正在运行的慢查询(执行超过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 锁信息查询
-- 查看当前锁信息
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 查看用户/角色
-- 查看所有用户
\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 查看权限
-- 查看表的权限
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 查看配置参数
-- 查看所有配置参数
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 表访问统计
-- 查看表的访问统计
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 最常访问的表
-- 查询最常访问的表
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;
九、实用系统函数
-- 当前时间
SELECT now();
SELECT current_timestamp;
-- 版本信息
SELECT version();
-- 当前事务ID
SELECT txid_current();
-- 执行计划分析
EXPLAIN SELECT * FROM 表名 WHERE 条件;
EXPLAIN ANALYZE SELECT * FROM 表名 WHERE 条件;
-- 清理统计信息
ANALYZE 表名;
-- 手动垃圾回收
VACUUM 表名;
VACUUM FULL 表名; -- 需要谨慎使用,会锁表
十、常用快捷命令(psql元命令)
-- 列出所有数据库
\l
-- 连接数据库
\c 数据库名
-- 列出所有表
\dt
-- 列出所有视图
\dv
-- 列出所有序列
\ds
-- 查看表结构
\d 表名
-- 列出所有函数
\df
-- 列出所有索引
\di
-- 查看命令历史
\s
-- 执行外部文件
\i 文件名.sql
-- 切换输出格式
\x on/off -- 扩展显示模式
-- 查看执行时间
\timing on/off
-- 退出psql
\q
实用技巧
- 分页显示 :使用
\pset pager on 开启分页
- 结果格式化 :使用
\x auto 自动判断是否需要扩展显示
- 查询缓存 :使用
EXPLAIN (ANALYZE, BUFFERS) 获取更详细的执行计划
- 监控常用SQL:可以创建视图来简化常用复杂查询