目标
热事件表无限增长,拖慢工作集并加重 autovacuum 负担。本配方先建同构历史表,用 CTE 一次原子地移动并归档一批数据,再用带 LIMIT 的循环分批删除,避免长时间持锁,同时提醒历史表也需要自己的保留策略,并同步修改报表查询以联合历史表。
步骤要点
- 创建与热表同构的历史表。
- 用 CTE 一次性移动并归档一批数据。
- 用带 LIMIT 的循环分批删除,保持事务短小。
- 修改报表查询以联合历史表。
CREATE TABLE IF NOT EXISTS events_history (LIKE events INCLUDING ALL);
WITH moved AS (
DELETE FROM events WHERE created_at < now() - interval '90 days'
RETURNING *
)
INSERT INTO events_history SELECT * FROM moved;
排错提示
- 大数据量下单条 CTE 插入较慢,宜分批。
- 历史表若无保留策略会无限增长。
- 外键可能阻止移动数据。
适用边界
- 分批删除仍产生 WAL 与 vacuum 负载。
- 需要同步调整下游查询。