分离与附加分区
使用 ATTACH PARTITION 和 DETACH PARTITION 调入或调出分区,而不阻塞读取
分离与附加分区 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
为什么要分离分区
您可以将旧分区从在线表中移出,而不删除数据。常见用途包括:
- 归档到单独的数据库
- 迁移到更便宜的存储
- 先备份再删除
DETACH PARTITION
从父表中移除分区,但保留其中的数据:
ALTER TABLE events DETACH PARTITION events_2022;
-- events_2022 is now a standalone table.
-- Queries on events no longer see those rows.DETACH CONCURRENTLY(PG 14+)
避免获取 ACCESS EXCLUSIVE 锁:
ALTER TABLE events DETACH PARTITION events_2022 CONCURRENTLY;
-- Two-step: detach pending, then finalize. App writes continue.归档分离的分区
分离之后:
-- Backup with pg_dump:
pg_dump --table=events_2022 mydb > events_2022.sql
-- Move to a cold-storage Postgres or S3:
psql cold_db < events_2022.sql
-- Then drop from primary:
DROP TABLE events_2022;ATTACH PARTITION
将现有表添加为新分区:
CREATE TABLE events_2025 (LIKE events INCLUDING ALL);
-- Load data with COPY or INSERT ... SELECT
ALTER TABLE events ATTACH PARTITION events_2025
FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');ATTACH 期间的验证
ATTACH 会扫描新分区,以确认每一行都符合 FOR VALUES 的边界条件。可以在附加分区之前预先添加匹配的 CHECK 约束来避免扫描:
ALTER TABLE events_2025
ADD CONSTRAINT events_2025_ts_check
CHECK (ts >= '2025-01-01' AND ts < '2026-01-01');
ALTER TABLE events ATTACH PARTITION events_2025
FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');
-- No scan needed; PG trusts the CHECK.滚动时间窗口
按周或按月向前滚动:预先创建下一个分区,并删除最旧的分区:
BEGIN;
CREATE TABLE events_2024_q4 PARTITION OF events FOR VALUES FROM ('2024-10-01') TO ('2025-01-01');
DROP TABLE events_2023_q4;
COMMIT;切换存储层级
分离分区,使用 ALTER TABLE … SET TABLESPACE 将其迁移到较慢的存储,然后重新附加:
ALTER TABLE events DETACH PARTITION events_2022;
ALTER TABLE events_2022 SET TABLESPACE archive_disk;
ALTER TABLE events ATTACH PARTITION events_2022 FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');已附加分区上的索引
要附加分区,其索引必须与父表的索引匹配。在 PG 14+ 中,PG 可以在 ATTACH 期间自动创建缺失的索引。
原子分区交换
将 DETACH 和 ATTACH 放在一个事务中,即可原子地交换分区内容。这是“离线构建新分区,然后替换旧分区”的常见模式:
BEGIN;
ALTER TABLE events DETACH PARTITION events_2024_q1;
ALTER TABLE events ATTACH PARTITION events_2024_q1_new
FOR VALUES FROM ...;
COMMIT;性能
DETACH 和 ATTACH 都是目录操作——预先设置好约束后即可瞬间完成。在大规模场景中,CHECK 约束技巧至关重要。
回顾
分离与附加是分区在线维护的秘密武器。
- 使用 DETACH PARTITION CONCURRENTLY 在线移除分区
- 预先添加 CHECK 约束可跳过验证扫描
- 用于交换、归档和迁移存储层级
- 使用 BEGIN/COMMIT 实现原子操作
快速检查
运行 ATTACH PARTITION 时,如何避免全表扫描?
常见问题解答
「分离与附加分区」课时是免费的吗?
是的 — 「分离与附加分区」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「分离与附加分区」这节课中我会学到什么?
使用 ATTACH PARTITION 和 DETACH PARTITION 调入或调出分区,而不阻塞读取 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「分离与附加分区」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。