すべてのプロダクト
Search
ドキュメントセンター

:pg_partman (パーティションマネージャー)

最終更新日:Jan 07, 2026

PolarDB for PostgreSQL (Oracle 互換) のデータテーブルが大きくなると、パーティションテーブルを手動で管理するのは複雑で時間がかかります。pg_partman は、パーティション管理を自動化することでこの問題に対処する PostgreSQL 拡張機能です。この拡張機能は、時間またはシリアル ID に基づいてテーブルパーティションを自動的に作成・維持し、データ保持ポリシーを適用します。これにより、パーティションテーブルのライフサイクル管理が簡素化され、データベースの保守性とクエリパフォーマンスが向上します。

適用範囲

PolarDB for PostgreSQL (Oracle 互換) のサポート対象バージョン:Oracle 構文互換性 2.0、マイナーエンジンバージョン 2.0.14.19.40.0 以降。

説明

マイナーエンジンバージョンは、コンソールで表示するか、SHOW polardb_version; 文を実行して確認できます。お使いのバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードする必要があります。

特徴

pg_partman 拡張機能のコア機能は、時間または数値/ID 値に基づくパーティションテーブルの自動管理です。これは (pg_partman バージョン 5.0.1 以降) PostgreSQL の組み込みの宣言型パーティショニング機能に完全に基づいています。従来のトリガーベースの方法は使用されなくなりました。

その仕組みは以下の通りです。

  • パーティションの自動作成:バックグラウンドメンテナンスタスクが、日次、月次、または 100 万 ID ごとなどの設定された間隔に基づいて、将来のパーティションを事前に作成します。これにより、新しいデータをシームレスに書き込むことができます。

  • データ保持ポリシー:期限切れのデータパーティションを自動的にデタッチ (DETACH) またはドロップ (DROP) します。これにより、データのライフサイクルとストレージコストを管理します。

  • デフォルトパーティション:各パーティションセットにデフォルトパーティションを作成し、既存の子パーティションに属さないデータをキャッチします。これにより、データ損失を防ぎます。関連する関数を使用して、このデータを正しいパーティションに移行できます。

  • サブパーティショニングのサポート:多階層パーティショニングをサポートします。例えば、年次パーティションを日次パーティションに細分化して、複雑なデータ組織のニーズに対応できます。

クイックスタート

このセクションでは、ログテーブルを日次でパーティショニングする方法の完全な例を紹介し、pg_partman を始めるのに役立ちます。この例では、log_table という名前のログテーブルを作成し、created_at フィールドに基づいて毎日新しいパーティションを作成し、7 日以上経過したデータを自動的に削除するポリシーを設定します。

ステップ 1: 拡張機能のインストールと親テーブルの作成

まず、データベースに pg_partman 拡張機能をインストールします。次に、パーティショニング用の親テーブルを作成します。

-- 1. 現在のデータベースで pg_partman 拡張機能を有効にします。
CREATE EXTENSION pg_partman;

-- 2. ログデータを格納するための親テーブルを作成します。
-- PARTITION BY RANGE (created_at) は、このテーブルが created_at 列を範囲パーティショニングに使用するパーティションテーブルであることを指定します。
CREATE TABLE public.log_table (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    created_at timestamptz NOT NULL,
    message text
) PARTITION BY RANGE (created_at);

ステップ 2: パーティションセットの初期化

create_parent() 関数を呼び出して、log_tablepg_partman 管理システムに登録し、パーティショニングルールを定義します。

-- create_parent 関数を呼び出してパーティショニングを初期化します。
-- public.log_table: 管理対象の親テーブル。
-- created_at: パーティションキー列。
-- '1 day': パーティション間隔。新しいパーティションが毎日作成されることを意味します。
SELECT create_parent(
    p_parent_table := 'public.log_table',
    p_control := 'created_at',
    p_interval := '1 day'
);

正常に実行されると、pg_partman は現在の日付と今後数日間のパーティションを自動的に作成します。\d+ public.log_table コマンドを実行して、作成されたパーティションを表示できます。

ステップ 3: テストデータの挿入

親テーブル log_table にデータを挿入します。データは created_at の値に基づいて、対応するパーティションに自動的にルーティングされます。

INSERT INTO public.log_table (created_at, message)
SELECT generate_series(
     now() - interval '4 days',
     now(),
     interval '1 hour'
 ),
 'This is a log message.';

ステップ 4: 保持ポリシーの設定とクリーンアップの検証

データ保持ポリシーを設定して、pg_partman が期限切れのデータを自動的にクリーンアップするようにします。log_table が過去 2 日間のデータを保持し、期限切れのパーティションを自動的に DROP するように設定します。

-- 1. part_config テーブルを更新して、log_table の保持ポリシーを設定します。
UPDATE part_config
SET
    retention = '2 days',             -- 保持期間を 2 日に設定します。
    retention_keep_table = false      -- テーブル構造を保持しません。期限切れのパーティションを直接 DROP します。
WHERE parent_table = 'public.log_table';

-- 2. メンテナンス タスクを手動で実行して、保持ポリシーをトリガーします。
CALL run_maintenance_proc();

-- 3. 検証: パーティションリストを再度確認し、2 日以上経過したパーティションが削除されたことを確認します。
SELECT partition_schemaname, partition_tablename FROM show_partitions('public.log_table', 'DESC');

これで、日次でパーティショニングされ、自動的にクリーンアップされるログテーブルの設定が完了しました。

注意事項

pg_partman を使用する前に、データ損失やサービス中断を避けるために、以下の制限事項とリスクを理解してください。

  • 属性の継承pg_partman は、特定のインデックスや UNLOGGED ステータスなど、親テーブルから直接継承できない一部のプロパティを管理するためにテンプレートテーブルを使用します。テンプレートテーブルへの変更は、新しく作成されるパーティションにのみ影響します。既存のパーティションは手動で更新する必要があります。

  • タイムゾーン:時間に基づいてパーティショニングする場合、データベースシステム、クライアント、およびメンテナンスタスクを呼び出すすべての環境で一貫したタイムゾーンを使用するようにしてください。夏時間 (DST) などの問題によるパーティション作成の失敗やスキップを避けるために、UTC の使用を推奨します。

  • サブパーティショニング

    • サブパーティショニングの主な機能は、データの組織化とライフサイクル管理です。パフォーマンス向上への効果は限定的です。パフォーマンスを最適化したい場合は、サブパーティショニングに頼るのではなく、パーティション間隔を調整することを推奨します。サブパーティションが多すぎると、管理オーバーヘッドが増加し、max_locks_per_transaction リソースを使い果たす可能性があります。

    • サブパーティショニングは論理レプリケーション (PUBLICATION/SUBSCRIPTION) をサポートしていません。パーティションテーブルで論理レプリケーションを使用する予定がある場合は、サブパーティショニング機能の使用を避けてください。

    • サブパーティションの作成 (create_sub_parent) は破壊的な操作です。次のレベルのパーティショニングを追加するために、既存のパーティションを削除して再構築します。実行する前に、関連データのバックアップを推奨します。

  • オブジェクト名の長さ:PostgreSQL のオブジェクト名は 63 バイトに制限されています。pg_partman は、サフィックスを収容するためにテーブル名を自動的に切り捨てます。ただし、親テーブル名が長すぎて類似している場合、異なるパーティションセット間でパーティション名の競合が発生する可能性があります。親テーブル名は簡潔に保つことを推奨します。

  • UNIQUE 制約:パーティションキー以外の列にグローバルな一意性制約やプライマリキーを作成することはできません。これは PostgreSQL の宣言型パーティショニングのネイティブな制限です。pg_partman では、各パーティションにローカルな一意性制約を作成できますが、これはパーティションセット全体でのグローバルな一意性を保証するものではありません。

  • デフォルトパーティション:デフォルトパーティションに分類されるデータには注意が必要です。pg_partman は、既存のどのパーティションにも属さないデータを受け取るためにデフォルトパーティションを作成します。デフォルトでは、パーティションメンテナンスはデフォルトパーティション内のデータをチェックして新しいパーティションを作成することはありません。データが継続的にデフォルトパーティションに書き込まれる場合は、partition_data_* シリーズの関数を使用して、できるだけ早く正しいパーティションに移行してください。また、異常なデータ書き込みの原因を調査してください。

  • パーティショニングの取り消しundo_partition() を実行すると、すべてのパーティションメンテナンスが一時停止します。取り消し操作が完了するまで、run_maintenance() はそのパーティションセットに対して新しいパーティションを作成したり、保持ポリシーを適用したりしません。

  • ロックとリソース:多数のパーティションを管理すると、ロックリソースの消費量が増加する可能性があります。単一のパーティションセットに数百または数千のパーティションが含まれている場合、run_maintenance() やその他のメンテナンス操作では、メモリ不足を避けるために max_locks_per_transaction パラメーターの調整が必要になる場合があります。このような状況では、run_maintenance_proc() プロシージャの使用を推奨します。これは、各パーティションセットのメンテナンス後にトランザクションをコミットするため、長時間実行トランザクションによるロック競合を軽減します。

ベストプラクティス

シナリオ 1: 自動クリーンアップ機能付きの日次パーティションログテーブル

このシナリオは、ログ、監査レコード、モノのインターネット (IoT) の時系列データなど、急速に増加し、明確なライフサイクルを持つデータに適しています。

ビジネスシナリオ

audit_logs テーブルを日次でパーティショニングし、データを 30 日間保持し、期限切れのデータを直接削除するのではなく、別のスキーマに自動的にアーカイブします。

手順

  1. 親テーブルを作成し、パーティションセットを初期化します。

    -- 親テーブルを作成します。
    CREATE TABLE public.audit_logs (
        log_id uuid NOT NULL,
        event_time timestamptz NOT NULL,
        user_id text,
        details jsonb,
        PRIMARY KEY (event_time, log_id)
    ) PARTITION BY RANGE (event_time);
    
    -- 日次パーティショニングのためにパーティションセットを初期化します。
    SELECT create_parent(
        p_parent_table := 'public.audit_logs',
        p_control := 'event_time',
        p_interval := '1 day'
    );
  2. 保持およびアーカイブポリシーを設定します。30 日以上経過した古いパーティションを archive スキーマに移動し、その後のバッチ分析やバックアップに備えます。

    -- アーカイブ用のスキーマを作成します。
    CREATE SCHEMA IF NOT EXISTS archive;
    
    -- 構成を更新して保持ポリシーを設定します。
    UPDATE part_config
    SET
        retention = '30 days',          -- 30 日間保持します。
        retention_schema = 'archive'    -- 期限切れになったら archive スキーマに移動します。
    WHERE parent_table = 'public.audit_logs';

    run_maintenance() が実行されると、audit_logs_p2023_10_01 のように、全体が 30 日以上経過したパーティションテーブルは、プライマリパーティションセットからデタッチされます。そのスキーマは public から archive に変更され、archive.audit_logs_p2023_10_01 になります。

シナリオ 2: ID による業務テーブルのパーティショニング

このシナリオは、ユーザーテーブルや商品テーブルのように、数値 ID をプライマリキーとして使用し、パーティショニングによってホットデータとコールドデータを分離したいビジネスに適しています。

ビジネスシナリオ

orders テーブルを order_id でパーティショニングし、各パーティションに 1,000 万 ID を含めます。

判断のアドバイス

p_interval の選択は重要です。ビジネス ID の増加率と単一パーティションの適切なサイズに基づいて見積もることができます。毎日 100 万件の新規注文が追加される場合、10000000 の間隔は、約 10 日ごとに新しいパーティションが作成されることを意味します。

手順

  1. 親テーブルを作成し、パーティションセットを初期化します。

    -- 親テーブルを作成します。
    CREATE TABLE public.orders (
        order_id bigint NOT NULL,
        customer_id bigint,
        order_date timestamptz,
        amount numeric
    ) PARTITION BY RANGE (order_id);
    
    -- ID 範囲によるパーティショニングのためにパーティションセットを初期化します。
    -- 注意: p_interval は数値であってもテキストとして提供する必要があります。
    SELECT create_parent(
        p_parent_table := 'public.orders',
        p_control := 'order_id',
        p_interval := '10000000' -- 各パーティションには 1,000 万 ID が含まれます。
    );
  2. 保持ポリシーの設定 (オプション):古い注文データをアーカイブまたは削除できる場合は、ID ベースの保持ポリシーを設定できます。

    -- 最新の 5,000 万件の注文レコードを保持します。
    -- 現在の最大 order_id が 100,000,000 であると仮定します。
    -- このポリシーは、order_id < 50,000,000 のすべてのパーティションを削除します。
    UPDATE part_config
    SET
        retention = '50000000',
        retention_keep_table = false
    WHERE parent_table = 'public.orders';

シナリオ 3: 既存の大規模テーブルのパーティションテーブルへの移行

このシナリオは、テラバイト規模のテーブルなど、既存の大規模なモノリシックテーブルを、pg_partman で管理されるパーティション構造にスムーズに移行するためのものです。

ビジネスシナリオ

1 TB の sensor_data テーブルを月次パーティションテーブルに移行し、オンラインサービスへの影響を最小限に抑えます。

コアツール

partition_data_proc() プロシージャ。小規模なバッチおよび独立したトランザクションでデータを移行できるため、長時間実行されるテーブルロックやトランザクションのバックログを回避できます。

手順

  1. 準備:親テーブルを作成し、パーティションセットを初期化します。

    -- 1. 元のテーブルをデータソースとして機能するように名前変更します。
    ALTER TABLE public.sensor_data RENAME TO sensor_data_source;
    
    -- 2. 同じ構造で新しい親テーブルを作成します。
    CREATE TABLE public.sensor_data (
        reading_id bigserial,
        device_id text,
        ts timestamptz NOT NULL,
        value double precision
    ) PARTITION BY RANGE (ts);
    
    -- 3. パーティションセットを初期化します。
    SELECT create_parent('public.sensor_data','ts','1 month');
  2. データ移行の実行:partition_data_proc を使用して、sensor_data_source から新しいパーティションテーブル sensor_data にデータをバッチで移行します。

    -- データ移行プロシージャを呼び出します。
    -- p_source_table: ソーステーブルを指定します。
    -- p_interval: 各バッチで処理するデータの時間範囲。パーティション間隔以下に設定することを推奨します。ここでは '1 day' に設定されており、1 日分のデータが 1 つのトランザクションで処理されることを意味します。
    -- p_wait: 各バッチ間の待機時間 (秒)。I/O と CPU への持続的な圧力を軽減するために使用します。
    CALL partition_data_proc(
        p_parent_table := 'public.sensor_data',
        p_source_table := 'public.sensor_data_source',
        p_interval := '1 day',
        p_wait := 1
    );

    このプロシージャは、sensor_data_source テーブルのすべてのデータが移行されるまでループします。移行中、pg_partman は、必要に応じてパーティションを自動的に作成します。

  3. 最終ステップ:移行が完了したら、データ整合性を検証します。その後、元のデータソーステーブル sensor_data_source を安全に削除できます。移行中、アプリケーションは新しいパーティション化された親テーブル sensor_data に新しいデータを書き込み続けることができます。

基本概念

パーティションタイプと間隔

パーティションタイプ

pg_partman は PostgreSQL の宣言型パーティショニングに基づいており、主に以下のパーティショニング方法をサポートしています。

  • 範囲パーティショニング:タイムスタンプやシリアル ID などの連続データに適しています。これは最も一般的なパーティションタイプです。

  • リストパーティショニング:間隔が 1 の ID ベースのパーティショニングでのみサポートされます。

パーティション間隔 (p_interval)

このパラメーターは、各子パーティションがカバーするデータ範囲を定義します。

  • 時間ベース:'1 hour''1 day''1 week''1 month' など、有効な interval 値を受け入れます。

    説明
    • サポートされる最小時間間隔は 1 秒です。上限は PostgreSQL がサポートする最小および最大タイムスタンプ値によって制約されます。

    • create_parent() を初めて実行してパーティションセットを作成する際、1 日未満の間隔は、作成する最初のパーティションを決定するときに切り捨てられます。

      • 24 時間未満で 1 分より大きい間隔は、最も近い時間に切り捨てられます。

      • 1 分未満の間隔は、最も近い分に切り捨てられます。

      • システムは現在の実時間をサポートするのに十分なパーティションを作成します。これは、create_parent() を実行すると、予想よりも多くの過去のパーティションが作成され、すべての将来のパーティションが作成されない可能性があることを意味します。run_maintenance() の初回実行時に、不足している将来のパーティションが作成されます。これは、カスタム時間間隔をサポートする必要があるためです。24 時間以上の間隔の場合、設定は期待どおりに進みます。

    • 100 年以上の間隔の場合、拡張機能は世紀または千年紀の実際の開始点を使用してパーティション名と制約ルールを決定します。例えば、21 世紀と第 3 千年紀は 2001 年 1 月 1 日 (2000 年ではない) に始まりました。これは、0 年が存在しないことも意味します。

  • 数値/ID ベース:範囲サイズを表す整数を受け入れますが、'1000000' のようにテキストとして提供する必要があります。

説明
  • 週次パーティショニング:週の開始日は、p_start_partition パラメーターまたは create_parent() 実行時の現在の日付に依存します。月曜日を開始日として確実にするには、date_trunc() 関数で明示的に指定することを推奨します。例:p_start_partition := to_char(date_trunc('week', CURRENT_TIMESTAMP), 'YYYY-MM-DD HH24:MI:SS')

  • エポックタイム値:パーティションキーが UNIX エポックを格納する整数列である場合、p_epoch パラメーターを 'seconds''milliseconds' のように設定することで、pg_partman が時間ベースのパーティショニングとして管理できるようになります。

サブパーティショニング

サブパーティショニングを使用すると、既存のパーティションにさらに細かい粒度のパーティションを作成して、年単位でパーティショニングし、各年を月単位でサブパーティショニングするなどの多階層パーティション構造を形成できます。これは主に、大規模な年次パーティションを月単位でアーカイブするなど、データの組織化とライフサイクル管理に使用されます。パフォーマンス向上については、サブパーティショニングの効果は通常限定的です。トップレベルのパーティション間隔の調整を優先することを推奨します。

重要

サブパーティションの作成 (create_sub_parent) は破壊的な操作です。次のレベルのパーティショニングを追加するために、既存のパーティションを削除して再構築します。実行する前に、関連データのバックアップを推奨します。

データ保持ポリシー

pg_partman は、run_maintenance() を通じてデータ保持ポリシーを自動的に適用し、古いパーティションのライフサイクルを管理します。コア設定パラメーターは以下の通りです。

パラメーター

説明

retention

保持期間。

  • 時間ベースのパーティショニング:interval 値。この時間より古いデータのみを含むパーティションはドロップされます。

  • 数値/ID パーティショニング:整数。現在の最大 ID から保持値を引いた値より小さい数値/ID 値を持つパーティションはドロップされます。例えば、現在の最大数値/ID が 100 で保持値が 30 の場合、数値/ID 値が 70 未満のすべてのパーティションがドロップされます。ドロップ機能は、実行時に常に現在の最大数値/ID 値を使用します。

  • '30 days'

  • '50000000'

retention_keep_table

  • true (デフォルト):古いパーティションをデタッチ (DETACH) し、スタンドアロンのテーブルにします。

  • false:古いパーティションを直接ドロップ (DROP) します。

false

retention_schema

デタッチされた古いパーティションを、元のスキーマに保持したりドロップしたりする代わりに、指定されたアーカイブスキーマに移動します。この設定は retention_keep_table よりも優先されます。

'archive'

retention_keep_index

古いパーティションがデタッチされるときに、そのインデックスを保持するかどうか。デフォルトは true です。

true

重要

サブパーティションセットの場合、親テーブルのパーティションがドロップされると、そのパーティション自体がパーティションテーブルである場合、ドロップ操作は継承ツリー全体のすべての下位レベルのパーティションにカスケード (CASCADE) し、それらすべてを削除します。また、pg_partman によって管理されるパーティションセットは、常に少なくとも 1 つのパーティションを保持する必要があることにも注意してください。したがって、保持ポリシーはパーティションセット内の最後のパーティションをドロップすることはありません。

制約除外

制約除外は、パーティションテーブルのクエリパフォーマンスを向上させるための重要な機能です。クエリの WHERE 句が特定のパーティションを明示的に除外できる場合、クエリオプティマイザはそれらのパーティションのスキャンをスキップします。

pg_partman は、制約除外の効果を高めるために、非パーティションキー列に CHECK 制約を追加する機能を提供します。例えば、created_at でパーティショニングされたテーブルに対して、WHERE device_id = 'A' を伴うクエリが頻繁にある場合、データがもはや変更されない古いパーティションの device_id 列に制約を追加できます。

コア設定パラメーターは以下の通りです。

  • constraint_colsCHECK 制約を作成する列を指定するテキスト配列。例:'{device_id, user_id}'

  • optimize_constraint:制約を適用する前にパーティションがどれだけ古くなければならないかを定義する整数。デフォルト値の 30 は、30 パーティション間隔より古いパーティションに制約が適用されることを意味します。

  • constraint_valid:テーブルに制約を追加すると、テーブル内の既存のデータと競合する可能性があり、また pg_partman のメンテナンス操作に時間がかかる可能性があります。これらの制約を作成時に無効に設定できます。これにより、制約の作成はほぼ瞬時に完了しますが、検証されるまで制約除外は使用できません。したがって、デフォルトでは、制約は有効として作成されます。

説明
  • この機能は、制約が追加された古いパーティションでのデータ更新を制限します。古いデータを変更し、pg_partman がこれらの制約を正しく管理できるようにするには、管理する制約を名前変更しないでくださいreapply_constraints_proc() を使用して、制約を一時的に削除できます。

  • constraint_valid はサブパーティショニングでは正しく機能しない場合があります。最初のレベルのパーティションでは正常に実行できますが、より深いサブパーティション化されたテーブルセットで有効かどうかは、使用されるパーティション間隔の組み合わせと optimize_constraint の設定に依存します。例えば、週次パーティションがさらに日次パーティションに細分化され、日次パーティションの optimize_constraint が 7 日に設定されている場合、期待される効果が得られない可能性があります。週次パーティションの制約は正しく作成できますが、日次サブパーティションには対応する制約が作成されない場合があります。

テンプレートテーブルと属性の継承

PostgreSQL の宣言型パーティショニングは、非パーティションキーのプライマリキーや一意なインデックス、autovacuum 設定など、特定のオブジェクト属性の継承を完全にはサポートしていません。そのため、pg_partman はテンプレートテーブルメカニズムを使用して、新しく作成されたパーティションがこれらの属性を正しく継承できるようにします。以下の表は、pg_partman が特定の属性の継承をどのように管理するかを示しています。表に記載されていない属性は、親テーブルを通じて管理されます。

属性

親から継承

テンプレートから継承

非パーティション列のプライマリキー

-

以降

非パーティション列の一意なインデックス

-

以降

非パーティション列の一意なインデックスのテーブルスペース

-

以降

リレーション固有のオプション (autovacuum など)

-

以降

UNLOGGED テーブルステータス*

-

以降

非一意なインデックス

以降

-

権限/所有権

以降

-

  • 属性:create_parent() を呼び出すと、pg_partman は自動的に parent_table_template という名前のテーブルを作成します。インデックスの追加や autovacuum パラメーターの変更など、このテンプレートテーブルに対して行う ALTER TABLE 変更は、将来新しいパーティションが作成されるときに適用されます。

    説明

    テンプレートテーブルへの変更は、既存のパーティションに遡って適用されません。変更を行うには、古いパーティションに対して手動で ALTER 操作を実行する必要があります。

  • 権限と所有権:デフォルトでは、権限と所有権は継承されません。pg_partman を通じてこの機能を有効にした場合、この継承はパーティション作成時にのみ行われ、変更後に自動的に適用されないことに注意してください。reapply_privileges() で再適用できます。パーティションに直接アクセスする必要がない限り、通常はこの機能を有効にする必要はありません。必要な場合は、inherit_privileges オプションを設定できます。

    説明

    IDENTITY 機能を使用してシーケンスを管理する場合、新しいシーケンス値の自動生成は、親テーブルを通じてデータが挿入された場合にのみサポートされます。パーティションに直接データを挿入する場合はサポートされません。

説明
  • テンプレートテーブル機能は、宣言型パーティショニングの採用を加速するために設計された一時的なソリューションです。PostgreSQL コア機能が改善されるにつれて、pg_partman はテンプレートテーブルの使用を段階的に廃止します。将来、PostgreSQL コアで機能がサポートされるようになると、それはテンプレートテーブルを通じて管理されなくなります。メジャーバージョンにアップグレードする際には、関連する調整を計画する必要があります。

  • REPLICA IDENTITY 属性を USING INDEX 句と共に使用して論理レプリケーションをサポートしたい場合、この機能は、必要なインデックスがテンプレートテーブルではなく、実際の親テーブルに作成されている場合にのみサポートされることに注意してください。親テーブルとテンプレートテーブルの REPLICA IDENTITY 設定を制御できないため、どちらが正しい ID かを判断することは不可能です。他の ID 継承方法 (FULL および NONE) との一貫性を保つために、ソースとして親テーブルのみを選択することを推奨します。

  • PostgreSQL は、パーティションセットの親テーブル上の UNLOGGED 属性を一貫して処理しません。そのため、pg_partman はテンプレートテーブルを使用して UNLOGGED ステータスを管理します。ALTER コマンドが実行されると、親テーブルの属性は実際には変更されないため、新しいパーティションは変更前の属性を引き続き使用します。これは、パーティションセットを UNLOGGED から LOGGED に変更し、将来のすべてのパーティションにこの変更を継承させることはできないことを意味します。この属性はテンプレートテーブルを通じて管理されるため、テンプレートテーブルの属性を変更すると、新しく作成されたパーティションが変更を継承します。ただし、既存のパーティションは手動で変更する必要があります。詳細については、「Unable to alter partitioned table to set logged」をご参照ください。

運用と管理

自動メンテナンス

pg_partman のコアメンテナンスタスクである新しいパーティションの作成と保持ポリシーの適用は、run_maintenance() 関数または run_maintenance_proc() プロシージャによって実行されます。PolarDB for PostgreSQL (Oracle 互換) では、組み込みのバックグラウンドワーカーを使用してこのプロセスを自動化することを推奨します。設定した間隔で run_maintenance_proc() を自動的に呼び出します。

説明

バックグラウンドワーカーはデフォルトで無効になっています。有効にするには、Quota Center に移動し、クォータ ID polardb_pg_pg_cron を見つけ、[操作] 列で [申請] をクリックしてクォータをリクエストします。

手動メンテナンス

デバッグ中や特定のテーブルをきめ細かく制御する必要がある場合など、手動でメンテナンスをトリガーする必要がある場合があります。

  • CALL run_maintenance_proc(); このプロシージャの使用を推奨します。part_config 内で automatic_maintenanceon になっているすべてのパーティションセットのメンテナンスを実行します。また、各パーティションセットのメンテナンス後にトランザクションを自動的にコミットするため、ロック競合を軽減します。

  • SELECT run_maintenance('public.my_table'); 単一のパーティションセットのみをメンテナンスしたい場合は、この関数を呼び出して親テーブル名を渡すことができます。

監視とアラート

本番環境では、パーティションメンテナンスが正常に実行されているかを監視し、パーティションが時間通りに作成されないことによるデータ書き込みの失敗を防ぐ必要があります。part_config テーブルの maintenance_last_run フィールドは、各パーティションセットの最後の成功したメンテナンス実行のタイムスタンプを記録します。これは重要な監視メトリックです。

-- 自動メンテナンスされるすべてのパーティションセットのうち、
-- メンテナンス間隔の 2 倍以上、正常に実行されていないものをクエリします。
SELECT parent_table
FROM part_config
WHERE
    automatic_maintenance = 'on'
    AND maintenance_last_run < (now() - (SELECT setting::interval * 2 FROM pg_settings WHERE name = 'pg_partman_bgw.interval'));

このクエリが何らかの行を返した場合、対応するパーティションセットのメンテナンスが中断された可能性があり、即時の調査が必要です。

リファレンス関数

pg_partman は、一連の関数を通じてそのコア機能を提供します。これらの関数は、その目的に基づいて、作成、移行、メンテナンス、破棄の 4 つの主要なカテゴリに分類されます。

パーティションの作成

これらの関数は、パーティションセットを初期化し、サブパーティションを定義するために使用されます。

create_parent()

この関数はパーティションセットを初期化します。パーティションとして宣言された既存の親テーブルに対して、パーティショニングポリシー、事前作成ルール、およびメンテナンス方法を設定します。実行中は親テーブルに ACCESS EXCLUSIVE ロックをかけます。

説明
  • この関数に渡されるすべてのオプションは正しく設定する必要があります。すべてのデフォルト、インデックス、制約、権限、所有権を親テーブルに適用して、子テーブルに伝播させる必要があります。一意なインデックスやその他のテーブルプロパティの扱い方については、「テンプレートテーブルと属性の継承」をご参照ください。

  • デフォルトでは、特に設定しない限り、デフォルトパーティションとテンプレートテーブルが作成されます。

構文
create_parent(
    p_parent_table text
    , p_control text
    , p_interval text
    , p_type text DEFAULT 'range'
    , p_epoch text DEFAULT 'none'
    , p_premake int DEFAULT 4
    , p_start_partition text DEFAULT NULL
    , p_default_table boolean DEFAULT true
    , p_automatic_maintenance text DEFAULT 'on'
    , p_constraint_cols text[] DEFAULT NULL
    , p_template_table text DEFAULT NULL
    , p_jobmon boolean DEFAULT true
    , p_date_trunc_interval text DEFAULT NULL
    , p_control_not_null boolean DEFAULT true
    , p_time_encoder text DEFAULT NULL
    , p_time_decoder text DEFAULT NULL
)
RETURNS boolean
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル。既存のパーティション化されたテーブルである必要があり、スキーマ名を含める必要があります。

p_control

text

はい

なし

パーティショニングに使用されるコントロール列。例:created_at。時間、整数、text、または uuid 型をサポートします。

説明

コントロール列が text または uuid 型の場合、p_time_encoderp_time_decoder を設定する必要があります。

p_interval

text

はい

なし

パーティション間隔。パラメーター値はテキストとして渡す必要があります。有効な値は次のとおりです。

  • 時間ベースのパーティショニング:interval 値。例:'1 day'

  • 数値/ID パーティショニング:整数範囲。例:'100000'

    説明

    間隔値が '2' 以上の場合、p_typerange である必要があります。間隔が '1' の場合、p_typelist である必要があります。

p_type

text

いいえ

'range'

パーティションタイプ。有効な値は次のとおりです。

  • 'range':範囲。

  • 'list':リスト。

p_epoch

text

いいえ

'none'

パーティションキー列が時間 (エポック) を表す整数である場合に使用します。有効な値は次のとおりです。

  • 'none'

  • 'seconds'

  • 'milliseconds'

  • 'microseconds'

  • 'nanoseconds'

説明

すべてのテーブル名は時間に基づきます。コントロール列に通常のインデックスを作成するだけでなく、効率的な操作のために、to_timestamp(control_column) のような時間ベースの関数ベースのインデックスもコントロール列に作成してください。

p_premake

int

いいえ

4

事前に作成するパーティションの数。例えば、日次パーティショニングの場合、4 は、今後 4 日間のパーティションが常に維持されることを意味します。

説明

特定の間隔では、うるう年や月の日数の違いなどにより、余分なパーティションが作成されたり、1 つ見逃されたりすることがあります。これは通常問題を引き起こさず、自動的に修正されるはずです。詳細については、「パーティションタイプと間隔」をご参照ください。p_premake の値よりパーティショニングが遅れた場合、run_maintenance() を実行してデータを挿入すると自動的に追いつきます。

p_start_partition

text

いいえ

NULL

システムによる自動決定ではなく、最初のパーティションの開始値 (タイムスタンプまたは整数) を手動で指定できます。有効なタイムスタンプ (時間ベースのパーティショニングの場合) または正の整数 (数値/ID ベースのパーティショニングの場合) の値である必要があります。

説明
  • 実際のパラメータータイプは text です。

    • 時間ベースのパーティショニングの場合、指定されたタイムスタンプから CURRENT_TIMESTAMP (プラス p_premake) までのすべてのパーティションが作成されます。

    • 数値/ID ベースのパーティショニングの場合、指定された値から始まるパーティション (プラス p_premake) のみが作成されます。

  • サブパーティショニングの場合、これは初期設定にのみ適用され、その後のメンテナンスには適用されません。

p_default_table

boolean

いいえ

true

どの子パーティションにも属さないデータを受け取るために、パーティションセットにデフォルトパーティションを作成するかどうか。

p_automatic_maintenance

text

いいえ

'on'

このパーティションセットがグローバルな run_maintenance() によって自動的にメンテナンスされるかどうか。

  • 'on'

  • 'off''off' に設定した場合でも、パーティションセットをパラメーターとして渡すことで run_maintenance() を呼び出すことができます。

p_constraint_cols

text[]

いいえ

NULL

非パーティションキー列でのクエリパフォーマンスを最適化するために、古いパーティションに追加の CHECK 制約を追加する列名の配列。詳細については、「制約除外」をご参照ください。

p_template_table

text

いいえ

NULL

テンプレートテーブルを指定します。新しく作成されたパーティションは、インデックスや制約などのプロパティをこのテンプレートから継承します。指定しない場合、自動的に作成されます。

p_date_trunc_interval

text

いいえ

NULL

非標準の時間間隔のパーティション境界を揃えるために使用します。有効な値は、PostgreSQL 組み込みの date_trunc() 関数が受け入れる interval 値です。例:'day'、'week''month' など。

デフォルトでは、pg_partman の時間ベースのパーティショニングは、パーティションの開始値を典型的な境界 (日次なら深夜 0 時、月次なら 1 日、年次なら 1 月 1 日) に切り捨てます。これらの境界に当てはまらないパーティション間隔を使用したい場合、特に p_start_partition が設定されている場合に、子テーブルが期待される境界を持つようにするためにこのオプションが必要になることがあります。

例えば、9 週間の間隔を設定した場合、デフォルトでは pg_partman はテーブルを月単位で切り捨てます。これは、間隔が 1 ヶ月より長く 1 年より短いため、場合によっては月の初日から予期せず開始されることがあります。このパラメーターを week に設定すると、子テーブルの開始値が週単位で正しく切り捨てられ、9 週間の間隔と整合します。カスタムの時間間隔を使用する場合は、このオプションを試して目的のパーティションセットを取得するか、より一般的なパーティション間隔を使用してパーティション管理を簡素化してください。

p_control_not_null

boolean

いいえ

true

パーティションコントロール列が NOT NULL である必要があるかどうか。

  • true:コントロール列は NOT NULL に設定する必要があります。

  • false:コントロール列を NULL に設定できます。明確なユースケースがあり、慎重にレビューされていない限り、この設定を許可することは推奨しません。デフォルトの子パーティションに過剰なデータが溜まる可能性があります。

p_time_encoder

text

いいえ

NULL

パーティションキーが text/uuid 型の場合、タイムスタンプを文字列にエンコードするために使用される関数の名前。このパラメーターを設定すると、暗黙的に時間ベースのパーティショニングが有効になります。これにより、uuidv7ulidsnowflake id などの時間ベースの識別子によるパーティショニングが可能になります。関数は NULL 入力を安全に処理する必要があります。

p_time_decoder

text

いいえ

NULL

パーティションキーが text/uuid 型の場合、タイムスタンプを文字列にデコードするために使用される関数の名前。このパラメーターを設定すると、暗黙的に時間ベースのパーティショニングが有効になります。これにより、uuidv7ulidsnowflake id などの時間ベースの識別子によるパーティショニングが可能になります。関数は NULL 入力を安全に処理する必要があります。

create_sub_parent()

この関数は、既存のパーティションセットにサブパーティションを作成します。これは、既存のパーティションを削除して再構築し、新しい親テーブルに変換する必要があるため、破壊的な操作です。

説明
  • テーブル名を整理の頼りにする予定がある場合は、サブパーティションセットには短いテーブル名を使用することを推奨します。テーブル名の末尾に追加されるサフィックスは、そのパーティションセットが使用するパーティションタイプに関係なく、常に存在することが保証されます。長いテーブル名を使用すると、元の親テーブル名が切り捨てられ、トップレベルのパーティションサフィックスも切り捨てられる可能性があります。この切り捨ては自動的に行われ、最下位レベルのパーティションサフィックスが保持されるようにします。

  • 最初のレベルのサブパーティショニングでは、最初に create_parent() に渡した p_parent_table パラメーター値は、create_sub_parent() に渡す値とまったく同じである必要があります。さらにサブパーティション化するには、create_sub_parent() に異なる値、つまりトップレベルのパーティションセットの子テーブルを渡し始める必要があります。

構文
create_sub_parent(
    p_top_parent text
    , p_control text
    , p_interval text
    , p_type text DEFAULT 'range'
    , p_default_table boolean DEFAULT true
    , p_declarative_check text DEFAULT NULL
    , p_constraint_cols text[] DEFAULT NULL
    , p_premake int DEFAULT 4
    , p_start_partition text DEFAULT NULL
    , p_epoch text DEFAULT 'none'
    , p_jobmon boolean DEFAULT true
    , p_date_trunc_interval text DEFAULT NULL
    , p_control_not_null boolean DEFAULT true
    , p_time_encoder text DEFAULT NULL
    , p_time_decoder text DEFAULT NULL
)
RETURNS boolean
パラメーター

パラメーター

必須

デフォルト

説明

p_top_parent

text

はい

なし

トップレベルの親テーブルの名前。この関数は、この親テーブルの下にあるすべてのパーティションを新しいサブパーティションの親テーブルに変換します。

p_declarative_check

text

はい

NULL

安全確認フラグ。続行するには 'yes' に設定する必要があります。これは、パーティションデータをクリアするこの破壊的な操作を認識し、同意していることを確認するためです。

残りのパラメーター、例えば p_controlp_interval は、create_parent() と同じ機能を持ちますが、サブパーティションのポリシーを定義します。例えば、年単位でパーティショニングされた既存のパーティションセットがあり、各年のパーティションを日単位でパーティショニングしたい場合、この関数を使用できます。

create_partition_time()/create_partition_id()

時間ベースまたは数値/ID ベースのパーティションセットに対して、特定の子パーティションを手動で作成します。これは通常 run_maintenance() によって自動的に呼び出されますが、メンテナンスサイクル外でオンデマンドでパーティションを作成するためにも使用できます。

構文
create_partition_time(
    p_parent_table text
    , p_partition_times timestamptz[]
    , p_start_partition text DEFAULT NULL
)
RETURNS boolean

create_partition_id(
    p_parent_table text
    , p_partition_ids bigint[]
    , p_start_partition text DEFAULT NULL
)
RETURNS boolean
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

子パーティションを作成する親テーブル。

p_partition_times

timestamptz[]

はい

なし

timestamptz 値の配列。各値は作成する時間パーティションの下限を表します。

パーティションが存在しない場合は作成されます。存在する場合は、既存のパーティションが使用され、関数は正常に終了します。指定された値はパーティションの下限として使用され、パーティションの名前に影響を与えることに注意してください。したがって、指定されたタイムスタンプ値が他のパーティションと一致していることを確認してください。そうしないと、値が重複するギャップが発生する可能性があります。

p_partition_ids

bigint[]

はい

なし

bigint 値の配列。各値は作成する ID パーティションの下限を表します。

パーティションが存在しない場合は作成されます。存在する場合は、既存のパーティションが使用され、関数は正常に終了します。指定された値はパーティションの下限として使用され、パーティションの名前に影響を与えることに注意してください。したがって、指定された整数値が他のパーティションと一致していることを確認してください。そうしないと、値が重複するギャップが発生する可能性があります。

p_start_partition

text

いいえ

NULL

サブパーティショニングシナリオで、サブパーティションの開始値を指定するために使用します。

データの移行

これらの関数は、既存データや誤ってデフォルトパーティションに入ってしまったデータを正しいパーティションに移行するために使用されます。

partition_data_time()/partition_data_id()

親テーブル、デフォルトパーティション、または指定されたソーステーブルから、対応するパーティションにデータを移行します。ターゲットパーティションが存在しない場合、関数は自動的に作成します。デフォルトテーブルに挿入されたデータを修正することもできます。

説明
  • 大量のデータを自動的にパーティショニングするには、partition_data_proc プロシージャを使用して、より小さなバッチでデータをコミットすることを推奨します。これにより、長時間実行されるトランザクションやデータ量によって引き起こされる問題を効果的に軽減できます。

  • サブパーティションセットの場合、最上位から始めて、データをレイヤーごとにパーティショニングする必要があります。つまり、まずこの関数を実行し、次に create_sub_parent() を実行して追加のパーティションレベルを作成する必要があります。その後、新しく作成された各サブ親テーブルでこの関数を再度実行する必要があります。

構文
partition_data_time(
    p_parent_table text
    , p_batch_count int DEFAULT 1
    , p_batch_interval interval DEFAULT NULL
    , p_lock_wait numeric DEFAULT 0
    , p_order text DEFAULT 'ASC'
    , p_analyze boolean DEFAULT true
    , p_source_table text DEFAULT NULL
    , p_ignored_columns text[] DEFAULT NULL
)
RETURNS bigint

partition_data_id(
    p_parent_table text
    , p_batch_count int DEFAULT 1
    , p_batch_interval bigint DEFAULT NULL
    , p_lock_wait numeric DEFAULT 0
    , p_order text DEFAULT 'ASC'
    , p_analyze boolean DEFAULT true
    , p_source_table text DEFAULT NULL
    , p_ignored_columns text[] DEFAULT NULL
)
RETURNS bigint
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル (スキーマ名を含める必要があります)。

p_batch_count

int

いいえ

1

1 回の関数呼び出しで処理するバッチの数。

p_batch_interval

interval/bigint

いいえ

NULL

各バッチで移行するデータ間隔のサイズ。指定しない場合、パーティションテーブル自体の間隔が使用されます。

重要

デフォルトテーブルからデータを移動する場合、この値はパーティション間隔より小さくしてはいけません。パーティションセットの一部ではないデフォルトテーブルソースからデータを移動する場合、この間隔をパーティション間隔より小さく設定して、長時間実行されるトランザクションで大量のデータを移動するのを避けることができます。

p_lock_wait

numeric

いいえ

0

行ロックを待機する秒数。0 は無期限に待機することを意味します。

p_order

text

いいえ

'ASC'

データ移行の順序。

  • 'ASC':昇順

  • 'DESC:降順

p_analyze

boolean

いいえ

true

新しいパーティションを作成した後に親テーブルで ANALYZE を実行して統計を更新するかどうか。このパラメーターを false に設定して ANALYZE をスキップし、大量のデータの移動を高速化できます。false に設定した場合は、完了後にパーティションセットで手動で ANALYZE を実行して、統計が正しく更新されるようにすることを推奨します。

p_source_table

text

いいえ

NULL

パーティションセットにデータを移動するソーステーブルを指定します。指定しない場合、データはデフォルトパーティションから移行されます。

p_ignored_columns

text[]

いいえ

NULL

データ移行中に無視する列名の配列。これは主に GENERATED ALWAYS 属性を持つ列を処理するために使用されます。

partition_data_proc()

この関数は、partition_data_* 関数を独立したトランザクションバッチでループ呼び出しするストアドプロシージャです。大量のデータを移行する際に、長時間実行されるトランザクションやロック競合を避けるために、このプロシージャを使用することを推奨します。

構文
partition_data_proc (
    p_parent_table text
    , p_loop_count int DEFAULT NULL
    , p_interval text DEFAULT NULL
    , p_lock_wait int DEFAULT 0
    , p_lock_wait_tries int DEFAULT 10
    , p_wait int DEFAULT 1
    , p_order text DEFAULT 'ASC'
    , p_source_table text DEFAULT NULL
    , p_ignored_columns text[] DEFAULT NULL
    , p_quiet boolean DEFAULT false
)
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル。

p_loop_count

int

いいえ

NULL

ループする回数。設定しない場合、ソーステーブルのすべてのデータが処理されます。

p_interval

text

いいえ

NULL

基になる関数に p_batch_interval として渡され、各トランザクションバッチで処理されるデータ量を定義します。

p_lock_wait

int

いいえ

0

行ロックを待機する秒数。0 は無期限に待機することを意味します。

p_lock_wait_tries

int

いいえ

10

ロックを取得しようとする回数。

p_wait

int

いいえ

1

書き込み負荷を軽減するために、各バッチコミット後に一時停止する秒数。

p_order

text

いいえ

'ASC'

データ移行の順序。

  • 'ASC':昇順

  • 'DESC:降順

p_source_table

text

いいえ

NULL

データソーステーブル。

p_ignored_columns

text[]

いいえ

NULL

データ移行中に無視する列。

p_quiet

boolean

いいえ

false

プロシージャは値を返せないため、デフォルトでは進捗状況を示すために NOTICE を発行します。このオプションを設定すると、これらの通知が無効になります。

パーティションのメンテナンス

これらの関数は、日常的なパーティション管理、監視、および情報クエリに使用されます。

run_maintenance()

pg_partman のコアメンテナンス関数であり、cron またはバックグラウンドワーカーを使用して定期的に呼び出す必要があります。新しいパーティションの自動作成とデータ保持ポリシーの適用を担当します。

構文
run_maintenance(
    p_parent_table text DEFAULT NULL
    , p_analyze boolean DEFAULT false
)
RETURNS void
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

いいえ

NULL

メンテナンスするパーティションセット。

  • 指定した場合、automatic_maintenance の設定に関係なく、このパーティションセットのみがメンテナンスされます。

  • 指定しない場合、automatic_maintenance'on' に設定されているすべてのパーティションセットがメンテナンスされます。

p_analyze

boolean

いいえ

false

新しいパーティションを作成した後に親テーブルで ANALYZE を実行するかどうか。

大規模なパーティションセットの場合、ANALYZE の実行に時間がかかることがあります。run_maintenance() が 1 回の実行で複数のパーティションを管理する場合、ANALYZE の完了中にリソース競合が発生する可能性があります。ただし、制約除外またはパーティションプルーニングの完全な効果を保証するには、最終的に親レベルから一度 ANALYZE を実行する必要があります。このパラメーターを true に設定すると、少なくとも 1 つの新しいパーティションが作成されたパーティションセットで ANALYZE が実行されます。パーティションセットに新しいパーティションが作成されない場合、このパラメーターが true に設定されていても ANALYZE は実行されません。


run_maintenance_proc()

run_maintenance() のプロシージャ版です。各パーティションセットのメンテナンスに独立したトランザクションを使用するため、多数のパーティションセットを管理する際に長時間実行されるトランザクションによるロック競合を軽減できます。バックグラウンドワーカーはこのプロシージャを使用しません。標準の run_maintenance() 関数を使用します。

構文
run_maintenance_proc(
    p_wait int DEFAULT 0
    , p_analyze boolean DEFAULT NULL
)
パラメーター

パラメーター

必須

デフォルト

説明

p_wait

int

いいえ

0

各パーティションセットのメンテナンス間に待機する秒数。

p_analyze

boolean

いいえ

NULL

run_maintenance()p_analyze と同じです。

check_default()

pg_partman が管理するすべてのデフォルトパーティションにデータが存在するかどうかをチェックし、データを含むデフォルトテーブルとその行数を返します。これは、パーティショニングが正しく機能しているかを監視するための重要な手段です。partition_data_time()partition_data_id() を使用して、これらの親/デフォルトテーブルから正しいパーティションにデータを移動できます。

構文
check_default(
    p_exact_count boolean DEFAULT true
)
パラメーター

パラメーター

必須

デフォルト

説明

p_exact_count

boolean

いいえ

true

正確な行数を返すかどうか。false に設定するとチェックが高速化され、データが存在するかどうかのみが報告されます。

show_partitions()

指定されたパーティションセットのすべてのパーティションを一覧表示します。

説明

テーブルは、名前のネイティブなソート順ではなく、パーティション間隔の論理的な順序で返されます。

構文
show_partitions(
    p_parent_table text
    , p_order text DEFAULT 'ASC'
    , p_include_default boolean DEFAULT false
)
RETURNS TABLE (
    partition_schemaname text
    , partition_tablename text
)
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル。

p_order

text

いいえ

'ASC'

結果のソート順。

  • 'ASC':昇順

  • 'DESC':降順

p_include_default

boolean

いいえ

false

結果にデフォルトパーティションを含めるかどうか。

show_partition_name()

指定された値が属するべき子パーティションの名前を返します。パーティションが実際に存在するかどうかは関係ありません。

構文
show_partition_name(
    p_parent_table text
    , p_value text
    , OUT partition_schema text
    , OUT partition_table text
    , OUT suffix_timestamp timestamptz
    , OUT suffix_id bigint
    , OUT table_exists boolean
)
RETURNS record
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル。

p_value

text

はい

なし

それが属するパーティションを決定するために使用される時間または数値/ID 値 (テキストとして渡されます)。

説明

エポックタイムパーティショニングを使用している場合、整数エポック値ではなくタイムスタンプ値を指定してください。to_timestamp() を使用してエポック値を変換できます。

OUT partition_schema

text

-

-

パーティションスキーマ名。

OUT partition_table

text

-

-

パーティション名。

OUT suffix_timestamp または OUT suffix_id

timestamptz または bigint

-

-

パーティション名のサフィックス。

OUT table_exists

boolean

-

-

パーティションが実際に存在するかどうか。

show_partition_info()

指定されたパーティション名について、その境界値に関する情報を返します。

構文
show_partition_info(
    p_child_table text
    , p_partition_interval text DEFAULT NULL
    , p_parent_table text DEFAULT NULL
    , OUT child_start_time timestamptz
    , OUT child_end_time timestamptz
    , OUT child_start_id bigint
    , OUT child_end_id bigint
    , OUT suffix text
)
RETURNS record
パラメーター

パラメーター

必須

デフォルト

説明

p_child_table

text

はい

なし

パーティションの名前 (スキーマ名を含める必要があります)。

p_partition_interval

text

いいえ

NULL

境界を計算するためのパーティション間隔を指定します。指定しない場合、part_config テーブルから検索されます。

p_parent_table

text

いいえ

NULL

内部クエリを最適化するために親テーブル名を指定します。

OUT child_start_time & child_end_time

timestamptz

-

-

パーティションセットが時間ベースの場合、関数はこれらの出力パラメーターの値を返します。それ以外の場合は NULL を返します。

説明

開始値 (child_start_time) は包含され、終了値 (child_end_time) は排他です。これは、データベースで定義されたパーティション境界と完全に一致します。

OUT child_start_id & child_end_id

bigint

-

-

パーティションセットが整数ベースの場合、関数はこれらの出力パラメーターの値を返します。それ以外の場合は NULL を返します。

説明

開始値 (child_start_id) は包含され、終了値 (child_end_id) は排他です。これは、データベースで定義されたパーティション境界と完全に一致します。

OUT suffixtext

text

-

-

パーティション名に追加される、その内容を識別するテキスト部分を出力します。_p を除きます。例:20230324 または 920000pg_partman と同様のカスタムサフィックスを生成するのに役立ちます。

apply_constraints()/drop_constraints()/reapply_constraints_proc()

part_configconstraint_cols 列で定義された追加の CHECK 制約を管理します。

  • apply_constraints():指定されたパーティションセットのパーティションに制約を適用します。すべての制約名は partmanconstr_ で始まります。

    説明
    • カスタム制約を維持するためにこの関数を手動で呼び出す必要はありません。古いパーティションへの制約の追加は、新しいパーティションが作成されるときに自動的に管理されます。

    • パーティションに pg_partman 制約が既に存在する場合、関数は既存の制をスキップして重複作成を回避します。

    • 指定されたすべての列が NULL の場合、制約は作成されません。

    • パーティションパラメーターが指定されている場合、制約はそのパーティションにのみ適用されます。

    • パーティションパラメーターが指定されていない場合、制約は optimize_constraint 値より古い最後のパーティションに適用されます。例えば、optimize_constraint が 30 の場合、パーティションの事前作成が最新であれば、制約は現在のパーティションより 31 番目のパーティションに適用されます。

    • すべての古いパーティションに制約を適用するには、reapply_constraints_proc プロシージャを使用します。この方法には、最小限のパフォーマンスへの影響で制約の適用を簡素化するオプションがあります。

    • p_job_id は内部使用向けで、この関数を呼び出した元のジョブにログをマージできます。

    apply_constraints(
        p_parent_table text
        , p_child_table text DEFAULT NULL
        , p_analyze boolean DEFAULT FALSE
        , p_job_id bigint DEFAULT NULL
    )
    RETURNS void
  • drop_constraints()part_config で設定された列に対して pg_partman が作成した制約を削除します。これにより、古いデータを編集する必要があり、制約がそれを許可しない場合に、制約を簡単にクリーンアップできます。

    説明
    • 指定されたパーティションと設定された列で、partmanconstr_* で始まる制約のみを削除します。

    • すべてのパーティションの制約を削除するには、reapply_constraints_proc プロシージャを使用します。この方法には、最小限のパフォーマンスへの影響で制約の削除を簡素化するオプションがあります。

    • p_debug パラメーターは、使用される制約削除ステートメントを表示します。

    drop_constraints(
        p_parent_table text
        , p_child_table text
        , p_debug boolean DEFAULT false
    )
    RETURNS void
  • reapply_constraints_proc():すべてのパーティションに制約を一括で適用または削除し、ロック競合を避けるためにバッチでコミットします。

    reapply_constraints_proc(
        p_parent_table text
        , p_drop_constraints boolean DEFAULT false
        , p_apply_constraints boolean DEFAULT false
        , p_wait int DEFAULT 0
        , p_dryrun boolean DEFAULT false
    )

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

作成されたパーティションセットの親テーブル。

p_drop_constraints

boolean

いいえ

false

pg_partman が管理するすべての制約を削除します。現在および将来のテーブルを含むすべてのパーティションの制約を削除します。

p_apply_constraints

boolean

いいえ

false

optimize_constraint 値より古いすべてのパーティションに、設定された列の制約を適用します。

p_wait

int

いいえ

0

テーブルに制約の削除または追加を適用した後、次のテーブルに進む前に待機する秒数。

p_dryrun

boolean

いいえ

false

実際に制約の削除/適用コマンドを実行せずにこのプロシージャを実行します。コマンドが実行されるテーブルを NOTICE メッセージとして出力するだけです。


その他のメンテナンス関数

  • dump_partitioned_table_definition():パーティションセットの設定を再構築するための create_parent() 文と、part_config に保存されている追加パラメーターを設定するための UPDATE 文を生成します。

    説明
    • 現在、この関数は単一レベルのパーティションセットのみをサポートしています。

    • p_ignore_template によって生成された SQL は、実行前にテンプレートテーブルが作成されている必要があります。テンプレートテーブルに変更を加えていない場合は、ここで true を渡しても安全です。生成された SQL は pg_partman に新しいテンプレートテーブルを生成するように指示します。ただし、安全のため、pg_dump を使用してテンプレートテーブルをエクスポートし、生成された SQL を使用する前に復元して、テンプレートのオーバーライド設定を保持することを推奨します。

    dump_partitioned_table_definition(
      p_parent_table text,
      p_ignore_template_table boolean DEFAULT false
    )
    RETURNS text
    
  • partition_gap_fill():パーティションシーケンスに存在する可能性のあるギャップをチェックして埋めます。現在の最小パーティションから始めて、パーティション間隔に基づいて遭遇したギャップを、現在の最大パーティションまで埋めます。作成されたパーティションの数を返します。パーティションが作成されなかった場合は 0 を返します。

    partition_gap_fill(
        p_parent_table text
    )
    RETURNS integer
  • reapply_privileges():親テーブルの所有権と権限をすべてのパーティションに再適用します。

    説明
    • 親テーブルが所有する権限はすべてのパーティションに付与されます。親テーブルが所有しない権限は取り消されます (CASCADE)。

    • チェックされる権限は、SELECTINSERTUPDATEDELETETRUNCATEREFERENCES、および TRIGGER です。

    • 大規模なパーティションセットの場合、これは非常に時間のかかる操作になる可能性があるため、スタンドアロン関数として設計されています。この関数は、親テーブルと異なる権限のみを適用しますが、それでも各子パーティションとその個々のすべての権限についてシステムカタログの検索と比較が必要です。

    reapply_privileges(
        p_parent_table text
    )
    RETURNS void
  • stop_sub_partition():親パーティションのメンテナンスを維持しながら、サブパーティションセットの自動メンテナンスを停止します。デフォルトでは、パーティションでもあるパーティションを元に戻しても、その親パーティションセットも元に戻さない限り、その親パーティションセットの他のパーティションがサブパーティション化され続けるのを防ぐことはできません。親テーブルを削除したくないが、サブパーティションの作成を続けたくないというこの状況に対処するために、この関数を使用できます。

    説明

    この関数は、part_config_sub テーブルから親テーブルのエントリのみを削除します。

    stop_sub_partition(
        p_parent_table text
    )
    RETURNS boolean

パーティションの破棄

これらの関数は、パーティション構造を元に戻したり、保持ポリシーに従って古いパーティションを削除したりするために使用されます。

undo_partition()

パーティションセットのすべてのパーティションから単一のターゲットテーブルにデータを移動し、パーティション構造を削除します。これはデータ移動操作なので、注意して使用してください。

説明
  • この関数が実行されると、設定テーブルの undo_in_progress 列が true に設定されます。これにより、すべてのパーティション作成と保持管理が停止します。

  • デフォルトでは、パーティションはドロップ (DROP) されず、デタッチ (DETACH) されます。これにより、元のパーティションは空のスタンドアロンテーブルになります。

  • バッチパラメーターが手動で設定されていない場合、関数の各実行で 1 つのパーティションからターゲットテーブルにすべてのデータが移動されます。

  • すべてのパーティションがデタッチまたはドロップされると、設定データは pg_partman から自動的に削除されます。

  • サブパーティション化されたテーブルの場合、最下位レベルの親テーブルから元に戻す操作を開始し、レイヤーごとに上に進む必要があります。

構文
undo_partition(
    p_parent_table text
    , p_target_table text
    , p_loop_count int DEFAULT 1
    , p_batch_interval text DEFAULT NULL
    , p_keep_table boolean DEFAULT true
    , p_lock_wait numeric DEFAULT 0
    , p_ignored_columns text[] DEFAULT NULL
    , p_drop_cascade boolean DEFAULT false
    , OUT partitions_undone int
    , OUT rows_undone bigint)
RETURNS record
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル。スキーマ名を含め、pg_partman で既に設定されている親テーブル名と一致する必要があります。

p_target_table

text

はい

なし

古いパーティションテーブルからデータを受け取るスキーマ名を持つテーブル。

p_loop_count

int

いいえ

1

1 回の呼び出しで処理するバッチの数。

p_batch_interval

text

いいえ

NULL

各バッチで移動するデータ間隔のサイズ。非常に大きなパーティションをより小さなコミットバッチに分割するために、パーティション間隔より小さく設定できます。指定しない場合、または指定された間隔がパーティション間隔より大きい場合、設定されたパーティション間隔が使用されます。このパラメーターの値はテキストとして渡す必要があることに注意してください。

p_keep_table

boolean

いいえ

true

データ移行後に空のパーティションを保持するかドロップするか。

  • true:保持

  • false:リソースは削除されます。

説明

パーティションセットからテーブルを実際に削除するには、少なくとも 2 つのバッチが必要です。

p_lock_wait

numeric

いいえ

0

タイムアウトする前にテーブルまたは行のロックが解除されるのを待つ秒数。値 0 は無期限に待機することを意味します。

p_ignored_columns

text[]

いいえ

NULL

このオプションを使用すると、パーティションからターゲットテーブルにデータを移動する際に特定の列を除外できます。これは通常、GENERATED ALWAYS 型の列を使用する場合にのみ必要です。値を直接挿入すると移動が失敗するためです。パラメーターは列名のテキスト配列です。

p_drop_cascade

boolean

いいえ

false

サブパーティションをカスケードドロップするかどうか。p_keep_tablefalse の場合にのみ有効です。

説明

カスケードドロップにより、親テーブルがドロップされると、すべてのサブパーティションテーブルがドロップされます。

undo_partition_proc()

undo_partition() のプロシージャ版です。大量のデータを含むパーティションを元に戻す際に、バッチでコミットし、長時間実行されるトランザクションを避けるために、このプロシージャを使用することを推奨します。

構文
undo_partition_proc(
    p_parent_table text
    , p_target_table text DEFAULT NULL
    , p_loop_count int DEFAULT NULL
    , p_interval text DEFAULT NULL
    , p_keep_table boolean DEFAULT true
    , p_lock_wait int DEFAULT 0
    , p_lock_wait_tries int DEFAULT 10
    , p_wait int DEFAULT 1
    , p_ignored_columns text[] DEFAULT NULL
    , p_drop_cascade boolean DEFAULT false
    , p_quiet boolean DEFAULT false
)
パラメーター

そのパラメーターは undo_partition() と似ていますが、バッチ処理の動作を制御するための追加パラメーターがいくつかあります。

パラメーター

必須

デフォルト

説明

p_interval

text

いいえ

NULL

undo_partition() 関数の p_batch_interval パラメーターとして渡されます。パーティション間隔より小さい間隔を設定して、データをバッチでコミットするために使用します。設定しない場合、デフォルトでパーティション間隔が使用されます。

p_lock_wait_tries

int

いいえ

10

プロシージャが p_lock_wait で設定された時間を待機しようとする回数を設定します。

p_wait

int

いいえ

1

書き込み負荷を軽減するために、プロシージャが各コミット (バッチ) 間に指定された秒数だけ一時停止するようにします。

p_quiet

boolean

いいえ

false

サブプロシージャは値を返せないため、デフォルトでは進捗状況を示すために NOTICE を発行します。このオプションを設定すると、これらの通知が抑制されます。

drop_partition_time()/drop_partition_id()

保持ポリシーに基づいて、古いテーブルの削除またはデタッチを手動でトリガーします。デフォルトでは、古いテーブルは実際に削除されるのではなく、デタッチされるだけです。この関数を直接呼び出すのではなく、設定された保持ポリシーを持つ run_maintenance() 関数を使用して古いテーブルを自動的に削除することを推奨します。

構文
drop_partition_time(
    p_parent_table text
    , p_retention interval DEFAULT NULL
    , p_keep_table boolean DEFAULT NULL
    , p_keep_index boolean DEFAULT NULL
    , p_retention_schema text DEFAULT NULL
    , p_reference_timestamp timestamptz DEFAULT CURRENT_TIMESTAMP
)
RETURNS int

drop_partition_id(
    p_parent_table text
    , p_retention bigint DEFAULT NULL
    , p_keep_table boolean DEFAULT NULL
    , p_keep_index boolean DEFAULT NULL
    , p_retention_schema text DEFAULT NULL
)
RETURNS int
パラメーター

パラメーター

必須

デフォルト

説明

p_parent_table

text

はい

なし

パーティションセットの親テーブル。

p_retention

interval/bigint

いいえ

NULL

保持ポリシーを手動で指定します。指定しない場合、part_config テーブルの設定が使用されます。

p_keep_table

boolean

いいえ

NULL

継承を解除する際にテーブルを保持するかドロップするか。

  • true:テーブルをデタッチします。

  • false:テーブルをドロップします。

p_keep_index

boolean

いいえ

NULL

パーティションの継承を解除する際にインデックスを保持するかドロップするか。

  • true:保持

  • false:ドロップ

p_retention_schema

text

いいえ

NULL

期限切れのテーブルをドロップする代わりに、アーカイブのためにこのスキーマに移動します。

p_reference_timestamp

timestamptz

いいえ

CURRENT_TIMESTAMP

(時間ベースのパーティショニングのみ) どのパーティションが影響を受けるかを決定するために、異なる参照タイムスタンプを指定します。

設定テーブル

pg_partman のすべての動作は、2 つのコア設定テーブルによって駆動されます。create_parent() または create_sub_parent() 関数を使用してパーティションセットを作成すると、対応する設定が自動的にこれらのテーブルに挿入されます。これらのテーブルのレコードを直接変更して、パーティションセットの動作を動的に調整することもできます。

part_config

このテーブルは pg_partman の主要な設定センターであり、すべてのトップレベルの親テーブルのパーティショニングポリシーとメンテナンス設定を保存します。

設定項目 (列名)

データ型

デフォルト値

説明

parent_table

text

なし

パーティションセットの親テーブルの名前。

control

text

なし

パーティショニングの基準として使用されるコントロール列の名前。時間または整数型の列である必要があります。

partition_interval

text

なし

パーティション間隔。時間ベースのパーティショニングの場合、interval 値 (例:'1 day') です。数値/ID パーティショニングの場合、整数範囲 (例:'1000000') です。

partition_type

text

'range'

パーティションタイプ。現在 'range''list' をサポートしています。

premake

int

4

事前に作成するパーティションの数。現在のパーティションに加えて、この数だけ将来のパーティションが常に維持されることを意味します。

automatic_maintenance

text

'on'

このパーティションセットがグローバルな run_maintenance() タスクによって自動的に管理されるかどうかを制御します。'off' に設定した後も、親テーブル名を指定して手動でメンテナンスできます。

template_table

text

なし

新しいパーティションのテンプレートテーブル。新しく作成されたパーティションは、インデックス、制約、および親テーブルから継承できないその他の属性をこのテンプレートから継承します。

retention

text

NULL

データ保持ポリシー。時間ベースのパーティショニングの場合、interval (例:'3 months') です。数値/ID パーティショニングの場合、整数です。このポリシーより古いパーティションが処理されます。NULL は永続的な保持を意味します。

retention_schema

text

NULL

古いパーティションが期限切れになったとき、削除する代わりにアーカイブのためにこの指定されたスキーマに移動します。このオプションは retention_keep_table よりも優先されます。

retention_keep_table

boolean

true

期限切れのパーティションの処理方法を制御します。

  • true はパーティションセットからテーブルをデタッチ (DETACH) するだけを意味します。

  • false はテーブルを完全にドロップ (DROP) することを意味します。

retention_keep_index

boolean

true

デタッチされるときにテーブル上のインデックスを保持するかどうかを制御します。

  • true:パーティションがデタッチされるときにそのインデックスを保持します。

  • false:パーティションがデタッチされるときにそのインデックスをドロップします。

retention_keep_publication

boolean

false

デタッチされたテーブルを元の論理レプリケーションのパブリケーションに保持するかどうかを制御します。

  • true:パブリケーションに保持します。

  • false:パブリケーションから削除します。

epoch

text

'none'

パーティションキー列が時間 (エポック) を表す整数である場合に使用します。

  • 'seconds'

  • 'milliseconds'

  • 'microseconds'

  • 'nanoseconds'

constraint_cols

text[]

NULL

列名の配列。pg_partman は、制約除外を通じてクエリパフォーマンスを最適化するために、古いパーティションのこれらの列に CHECK 制約を自動的に作成します。

optimize_constraint

int

30

constraint_cols で定義された制約を適用する前にパーティションがどれだけ古くなければならないかを定義します。値は最新のパーティションに対するパーティションの数です。デフォルト値の 30 は、データを含む最新のパーティションより 30 ポジション前のパーティションにこれらの制約が作成されることを意味します。

constraint_valid

boolean

true

constraint_cols によって定義された制約が有効 (VALID) として作成されるかどうかを制御します。

  • true:有効 (VALID)。

  • false:無効 (NOT VALID)。これによりメンテナンスプロセスを高速化できますが、制約が有効になる前に手動で検証する必要があります。

infinite_time_partitions

boolean

false

新しいデータが書き込まれなくても新しい時間パーティションを作成し続けるかどうか。

  • true:新しいデータがなくても新しいパーティションを作成します。

  • false:新しいデータが挿入されない場合、無限の空のテーブルを作成するのを避けるために、時間ベースのパーティションセットに新しいパーティションは作成されません。

datetime_string

text

なし

パーティション名のサフィックスを生成するために使用される日時フォーマット文字列 (例:YYYY_MM_DD)。

inherit_privileges

boolean

false

親テーブルの権限と所有権をすべてのパーティションに継承するかどうか。パーティションに直接アクセスする必要がある場合にのみ有効にします。

  • true:継承する。

  • false:継承しない。

ignore_default_data

boolean

true

メンテナンスタスクが新しいパーティションを作成するかどうかを決定する際に、デフォルトパーティションのデータを無視するかどうか。問題を修正するために一時的にこれを false に設定します。ただし、これによりパーティションのカバレッジにギャップが生じ、データがデフォルトテーブルに入る状況が悪化する可能性があります。したがって、メンテナンスの問題を修正した後は、このオプションを長期間有効にしないでください。

maintenance_order

int

NULL

run_maintenance() が複数のパーティションセットをメンテナンスするときの実行順序を定義し、数値の昇順で実行されます。

  • NULL 値は、定義された値を持つパーティションセットの後に実行されることを意味し、NULL に設定されたパーティションセットは不確定な順序で実行されます。

  • サブパーティションセットの場合、デフォルトでは、パーティションは親テーブルの順序を継承します。デフォルト値が維持される場合、親テーブルのメンテナンスが実行されるときにパーティションは論理的な順序で実行されます。

subscription_refresh

text

NULL

メンテナンス実行時にリフレッシュする論理レプリケーションサブスクリプションの名前。パーティションセットがテーブルを追加/削除するパブリケーションをサブスクライブしており、パーティションセットがこれらの変更を認識する必要がある場合は、このオプションを使用してサブスクリプション名を指定する必要があります。そうしないと、他の方法でリフレッシュされない限り、サブスクリプションはパブリッシャーによって追加された新しいテーブルを認識しません。詳細については、「ALTER SUBSCRIPTION」をご参照ください。

sub_partition_set_full

boolean

false

サブパーティションセットが完全に作成されたかどうかをマークします。多くのサブパーティションセットがある場合、これにより run_maintenance() がより効率的に実行されます。

undo_in_progress

boolean

false

undo_partition() が実行されると、このフラグが true に設定され、すべてのメンテナンス操作が一時停止します。

maintenance_last_run

timestamptz

NULL

このパーティションセットの最後の成功したメンテナンス実行のタイムスタンプを記録します。これは、パーティションメンテナンスが正常に実行されていることを確認するための監視メトリックとして使用できます。

part_config_sub

このテーブルはサブパーティションの設定を保存します。その構造は基本的に part_config と同じですが、1 つの重要な違いがあります。それは、sub_parent 列を使用して直属の親テーブルを識別することです。

  • sub_parent (text):サブパーティションセットの親テーブルの名前。このテーブル自体がトップレベルの親テーブルのパーティションです。

  • その他の列:partition_intervalretentionpremake など、テーブル内の他のすべての列は part_config と同じ意味を持ちますが、そのスコープは現在のサブパーティションセットです。

すべての列の定義を確認する必要はありません。基本的に、pg_partman がサブパーティションセットをメンテナンスするときは、sub_parent をキーとして part_config_sub テーブルの設定行を検索し、その行で定義されたポリシーを適用します。