PostgreSQL 常用查询命令汇总

PostgreSQL 常用查询命令汇总

一、数据库信息查询

1.1 查看数据库列表

sql 复制代码
-- 查看所有数据库
\l
-- 或
SELECT datname FROM pg_database;

-- 查看当前数据库
SELECT current_database();

1.2 查看数据库大小

sql 复制代码
-- 查看当前数据库大小
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 查看所有表

sql 复制代码
-- 查看当前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 查看表结构

sql 复制代码
-- 查看表结构
\d 表名

-- 查看表详细信息(包括索引、触发器、约束等)
\d+ 表名

-- 使用SQL查询列信息
SELECT 
    column_name, 
    data_type, 
    character_maximum_length,
    is_nullable,
    column_default
FROM information_schema.columns 
WHERE table_name = '表名';

2.3 查看表大小

sql 复制代码
-- 查看表大小(不含索引)
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 表名;  -- 需要谨慎使用,会锁表

十、常用快捷命令(psql元命令)

sql 复制代码
-- 列出所有数据库
\l

-- 连接数据库
\c 数据库名

-- 列出所有表
\dt

-- 列出所有视图
\dv

-- 列出所有序列
\ds

-- 查看表结构
\d 表名

-- 列出所有函数
\df

-- 列出所有索引
\di

-- 查看命令历史
\s

-- 执行外部文件
\i 文件名.sql

-- 切换输出格式
\x on/off  -- 扩展显示模式

-- 查看执行时间
\timing on/off

-- 退出psql
\q

实用技巧

  1. 分页显示 :使用 \pset pager on 开启分页
  2. 结果格式化 :使用 \x auto 自动判断是否需要扩展显示
  3. 查询缓存 :使用 EXPLAIN (ANALYZE, BUFFERS) 获取更详细的执行计划
  4. 监控常用SQL:可以创建视图来简化常用复杂查询
相关推荐
次旅行的库4 小时前
【问渠哪得清如许-数据分析】学习笔记-上
数据库·笔记·sql·学习·postgresql·数据分析
MrMua4 小时前
Ubuntu24.04 安装 PostgreSQL18,配置远程连接,安装常用插件,以及性能调优
ubuntu·postgresql·远程连接
Allen_LVyingbo5 小时前
PostgreSQL动态分区裁剪技术:查询性能优化解析(2026年版)
数据库·算法·观察者模式·postgresql·性能优化·架构
项目工程打工马5 小时前
Ubuntu 上 Nginx 安装详细指南(新手零踩坑版)
nginx·ubuntu·postgresql
IvorySQL21 小时前
PostgreSQL 技术日报 (3月14日)|AI 落地 PostgreSQL 拒绝 PPT 空谈
数据库·postgresql·开源
IvorySQL1 天前
直播预告|PostgreSQL 18.3 x IvorySQL 5.3:开启 AI 数据库新纪元
数据库·postgresql·开源
ChaITSimpleLove1 天前
pstree 查看 PostgreSQL 进程树
postgresql
七夜zippoe1 天前
PostgreSQL高级特性在Python中的实战:JSONB、全文搜索、物化视图与分区表深度解析
数据库·python·postgresql·性能优化·分区表
lclcooky1 天前
【postgresql】分区表管理
java·数据库·postgresql