[ PROMPT_NODE_25122 ]
monitor-vacuum-analyze
[ SKILL_DOCUMENTATION ]
## 使用 VACUUM 和 ANALYZE 维护表统计信息
过时的统计信息会导致查询规划器做出错误的决策。VACUUM 用于回收空间,ANALYZE 用于更新统计信息。
**错误做法(统计信息陈旧):**
sql
-- 表有 100 万行,但统计信息显示只有 1000 行
-- 查询规划器选择了错误的策略
explain select * from orders where status = 'pending';
-- 显示:Seq Scan (因为统计信息显示表很小)
-- 实际上:Index Scan 会快得多
**正确做法(维护最新的统计信息):**
sql
-- 在大量数据变更后手动执行 analyze
analyze orders;
-- 分析 WHERE 子句中使用的特定列
analyze orders (status, created_at);
-- 检查表上次分析的时间
select
relname,
last_vacuum,
last_autovacuum,
last_analyze,
last_autoanalyze
from pg_stat_user_tables
order by last_analyze nulls first;
针对繁忙表的 Autovacuum 调优:
sql
-- 增加高频更新表的清理频率
alter table orders set (
autovacuum_vacuum_scale_factor = 0.05, -- 在 5% 的死元组时进行 Vacuum (默认 20%)
autovacuum_analyze_scale_factor = 0.02 -- 在 2% 的数据变更时进行 Analyze (默认 10%)
);
-- 检查 autovacuum 状态
select * from pg_stat_progress_vacuum;
参考:[VACUUM](https://supabase.com/docs/guides/database/database-size#vacuum-operations)