方法 1:使用 pg_stat_activity 实时查看活动查询
1. 查询当前正在执行的慢查询
sql
SELECT
pid,
now() - query_start AS duration, -- 查询已运行时间
query, -- 当前执行的 SQL 语句
state, -- 状态(active/idle)
client_addr, -- 客户端 IP
application_name -- 应用名称
FROM pg_stat_activity
WHERE
state = 'active' -- 仅查看活动中的查询
AND now() - query_start > interval '1 second' -- 自定义慢查询阈值(如1秒)
ORDER BY duration DESC;
方法 2:启用 pg_stat_statements 扩展统计历史慢查询
1. 启用扩展
sql
-- 修改配置文件 postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
pg_stat_statements.max = 10000 -- 保留最多 10,000 条 SQL 记录
-- 重启 PostgreSQL
sudo systemctl restart postgresql
-- 在数据库中创建扩展
CREATE EXTENSION pg_stat_statements;
2. 查询历史慢查询统计
sql
SELECT
queryid,
query, -- SQL 语句(去重后)
calls, -- 执行次数
total_exec_time, -- 总耗时(毫秒)
mean_exec_time, -- 平均耗时
rows -- 处理的总行数
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10; -- 显示最耗时的前10条查询
方法 3:结合日志实时监控(自动记录慢查询)
1. 配置慢查询日志
# 修改 postgresql.conf
log_min_duration_statement = 1000 -- 记录执行超过 1 秒的查询
log_checkpoints = on
log_connections = on
log_disconnections = on
2. 使用 tail 实时跟踪日志
tail -f /var/lib/postgresql/数据目录/log/postgresql-*.log | grep "duration:"
3. 日志内容示例
LOG: duration: 2500.123 ms statement: SELECT * FROM large_table WHERE column = 'value';