0Pricing
SQL Academy · 课时

分离与附加分区

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么要分区:裁剪与维护
  2. 范围、列表与哈希分区
  3. 分离与附加分区
  4. 高效查询跨分区数据
← 返回 SQL Academy