[ PROMPT_NODE_23534 ]
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 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% 的死元组时进行清理(默认 20%)
autovacuum_analyze_scale_factor = 0.02 -- 在 2% 的数据变更时进行分析(默认 10%)
);
-- 检查自动清理状态
select * from pg_stat_progress_vacuum;
参考:[VACUUM](https://supabase.com/docs/guides/database/database-size#vacuum-operations)