パーティションの切り離しと接続
ATTACH PARTITIONとDETACH PARTITIONを使い、読み取りをブロックせずにパーティションを追加・切り離します。
「パーティションの切り離しと接続」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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 以降では、ATTACH 中に不足しているインデックスを PG が自動作成できます。
パーティションのアトミックな入れ替え
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 の実行時に、テーブル全体のスキャンを回避するにはどうしますか?
よくある質問
「パーティションの切り離しと接続」レッスンは無料ですか?
はい。「パーティションの切り離しと接続」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「パーティションの切り離しと接続」で何を学びますか?
ATTACH PARTITIONとDETACH PARTITIONを使い、読み取りをブロックせずにパーティションを追加・切り離します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「パーティションの切り離しと接続」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。