在 Debian 上调试 PostgreSQL 慢查询,一般可以按下面几个步骤来做。
配置文件通常在:
/etc/postgresql/<版本>/main/postgresql.conf
编辑该文件,设置以下内容(示例):
# 记录执行超过 1 秒的 SQL
log_min_duration_statement = 1000
# 日志输出方式
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'
# 可选:记录更多上下文
log_statement = 'none' # 不建议开 all,性能影响大
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
sudo systemctl restart postgresql
sudo tail -f /var/lib/postgresql/<版本>/main/pg_log/postgresql-*.log
sudo apt install postgresql-contrib
在 postgresql.conf 中:
shared_preload_libraries = 'pg_stat_statements'
重启数据库后,在目标数据库中执行:
CREATE EXTENSION pg_stat_statements;
SELECT
query,
calls,
total_exec_time,
mean_exec_time,
max_exec_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;
对怀疑的 SQL 使用:
EXPLAIN ANALYZE SELECT * FROM your_table WHERE ...;
重点关注:
Seq Scan(全表扫描)Rows removed by filter\d your_table
SELECT * FROM pg_stat_user_tables
ORDER BY seq_scan DESC;
SELECT relname, n_dead_tup, n_live_tup
FROM pg_stat_user_tables;
如有大量 dead tuples:
VACUUM ANALYZE your_table;
top
htop
iostat -x 1
free -h
常见调优项:
shared_buffers
work_mem
maintenance_work_mem
effective_cache_size
| 问题 | 可能原因 |
|---|---|
| 突然变慢 | 统计信息过期 → ANALYZE |
| 全表扫描 | 缺索引 / 索引失效 |
| 偶发慢 | 锁等待 / 自动 vacuum |
| 写入慢 | IO 瓶颈 / WAL 配置 |
| 连接多就慢 | max_connections 过大 |
如果你愿意,可以把:
EXPLAIN ANALYZE 结果发出来,我可以帮你具体分析原因。