postgresql 高频使用语句
postgresql 高频使用语句
1. 查询表以及索引
1.1 数据库
查看当前数据库
>SELECT current_database();
查看所有数据库
>\l
切换数据库
>\c NEW_DATABASE
1.2 表
查询当前库下的所有表
>\dt
查询数据库所有的表
>select * from pg_tables;
查询表字段
> SELECT * FROM information_schema.columns WHERE table_name = 'tag';
查询表结构信息
\d+ pg_tables;
1.3 索引
查询索引
>SELECT * FROM pg_indexes WHERE tablename = 'task';
>\d+ pg_tables;
添加索引
>CREATE INDEX CONCURRENTLY idx_repository_name on artifact(repository_name);
2. 查看慢查询的连接
-- 查看所有活动连接及其执行时间
SELECT pid,usename,application_name,client_addr,state,now() - query_start AS duration,query
FROM pg_stat_activity
WHERE state = 'active'AND now() - query_start > interval '5 seconds' -- 设置慢查询阈值
ORDER BY duration DESC;
分析语句
>EXPLAIN SELECT * FROM project_blob WHERE project_id = 104;
查询当前有排他锁的进程
SELECT -- 锁信息lock.locktype, lock.mode, lock.granted, -- 是否已获得锁lock.pid, -- 持有/等待锁的进程ID-- 进程信息proc.query, proc.query_start, now() - proc.query_start AS duration, proc.state, proc.wait_event_type,proc.wait_event,-- 锁对象信息(表/行)CASE lock.locktypeWHEN 'relation' THEN pg_class.relnameWHEN 'tuple' THEN pg_class.relname || ' (行锁)'ELSE NULLEND AS locked_object,lock.page, lock.tuple, -- 行锁的行号-- 阻塞关系blocked.pid AS blocked_pid -- 被该锁阻塞的进程
FROM pg_locks lock
LEFT JOIN pg_stat_activity proc ON lock.pid = proc.pid
LEFT JOIN pg_class ON lock.relation = pg_class.oid
LEFT JOIN pg_locks blocked_lock ON lock.locktype = blocked_lock.locktype AND lock.relation = blocked_lock.relation AND lock.page = blocked_lock.page AND lock.tuple = blocked_lock.tupleAND NOT blocked_lock.granted
LEFT JOIN pg_stat_activity blocked ON blocked_lock.pid = blocked.pid
WHERE lock.mode = 'RowExclusiveLock' -- 筛选行级排他锁AND lock.granted = true -- 已持有的锁
ORDER BY duration DESC;
SELECTa.pid,a.query,a.query_start,now() - a.query_start AS duration,a.state,a.wait_event_type, l.mode,l.granted,relname AS locked_table
FROM pg_locks l
JOIN pg_stat_activity a ON l.pid = a.pid
LEFT JOIN pg_class c ON l.relation = c.oid
WHERE l.mode = 'AccessShareLock'AND l.granted = true
ORDER BY duration DESC;
