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

PolarDB:pg_pathman プラグインの使用

最終更新日:Jun 04, 2024

このトピックでは、pg_pathmanプラグインの一般的な使用シナリオについて説明します。

背景情報

パーティションテーブルのパフォーマンスを向上させるために、pg_pathmanプラグインがPolarDB for PostgreSQLに導入されました。 このプラグインを使用すると、パーティションを管理し、パーティション分割スキームを最適化できます。

pg_pathman 拡張を作成する

test=# create extension pg_pathman;
拡張の作成 

インストール済みの拡張を表示する

以下のコマンドを実行して、インストール済みの拡張と pg_pathman プラグインのバージョンを表示します。

test=# \dx
                     List of installed extensions
    名前 | バージョン | スキーマ | 説明
----------- ---------------------------- ----------------------------------
 pg_pathman | 1.5     | public     | Partitioning tool for PostgreSQL
 plpgsql | 1.0 | pg_catalog | PL/pgSQL手続き型言語
(2行) 

プラグインをアップグレードする

PolarDB for PostgreSQLは、データベースサービスを改善するためにプラグインを定期的にアップグレードします。 プラグインをアップグレードするには、以下の手順を実行します。

対応するクラスターを最新バージョンにアップグレードします。

特徴

  • ハッシュおよび範囲分割をサポートします。
  • 自動および手動パーティション管理をサポートします。 自動パーティション管理では、関数を使用してパーティションを作成し、プライマリテーブルのデータをパーティションテーブルに移行します。 手動パーティション管理では、関数を使用して既存のテーブルをパーティションテーブルにアタッチしたり、テーブルをパーティション分割テーブルからデタッチしたりできます。
  • カスタムドメインとINT、FLOAT、DATEなどの一般的なデータ型を含むいくつかのパーティションフィールドのサポート。
  • 結合とサブクエリを使用して、分割テーブルの効果的なクエリ計画を作成できます。
  • RuntimeAppendおよびRuntimeMergeAppendパラメーターを使用すると、システムは動的にパーティションを選択できます。
  • PartitionFilter: INSERTトリガーの効率的なドロップイン置換。
  • 新しく挿入されたデータの自動パーティション作成。 この機能は、範囲分割にのみ適用されます。
  • パーティションテーブルに対する効率的な読み取りまたは書き込み操作を可能にするCOPY FROMおよびCOPY TOステートメントのサポート。
  • パーティションフィールドを更新できます。 パーティションフィールドを更新するには、トリガーを追加します。 パーティションフィールドを更新する必要がない場合は、トリガーがパフォーマンスに悪影響を与える可能性があるため、トリガーを追加しないことをお勧めします。
  • ユーザー定義のコールバック関数は、パーティションが作成されると自動的にトリガーされます。
  • 非ブロッキングテーブル分割がサポートされています。 プライマリテーブルからパーティションテーブルへのノンブロッキングデータ移行は、バックグラウンドで自動的に実行されます。
  • pg_pathman.insert_into_fdw=(disabled | postgres | any_fdw) パラメーターを設定することにより、postgres_fdwまたはその他の外部データラッパー (FDW) をサポートします。

Usage

詳細については、『GitHub』をご参照ください。

ビューおよびテーブル

pg_pathmanプラグインは、関数を使用してパーティションテーブルを維持し、次の例で説明するように、パーティションテーブルのステータスを表示できるビューを作成します。

  1. pathman_config
    が存在しない場合はテーブルを作成します。
        partrel         REGCLASS NOT NULL PRIMARY KEY,  -- The OID of the primary table.
        attname         TEXT NOT NULL,  -- The column name of the partition.
        parttype        INTEGER NOT NULL,  -- The type of the partition (hash or range).
        range_interval  TEXT,  -- The interval of range partitions.
    
        チェック (parttype IN (1, 2)) /* 許可されたパーツタイプのチェック */ ); 
  2. pathman_config_params
    が存在しない場合はテーブルを作成します (pathman_config_params)
        partrel        REGCLASS NOT NULL PRIMARY KEY,  -- The OID of the primary table.
        enable_parent  BOOLEAN NOT NULL DEFAULT TRUE,  -- Specifies whether to filter the primary table in the optimizer.
        auto           BOOLEAN NOT NULL DEFAULT TRUE,  -- Specifies whether to automatically expand partitions that do not exist during INSERT operations.
        init_callback REGPROCEDURE NOT NULL DEFAULT 0); -- パーティションが作成されたときのコールバック関数のOID。
  3. pathman_concurrent_part_tasks
    -- ヘルパーSRF関数
    CREATE OR REPLACE FUNCTION show_concurrent_part_tasks()
    リターンテーブル (
        userid     REGROLE,
        pid        INT,
        dbid       OID,
        relid      REGCLASS,
        processed  INT,
        ステータスTEXT)
    「pg_pathman」として、「show_concurrent_part_tasks_internal」
    言语Cストリクト;
    
    CREATE OR REPLACE VIEW pathman_concurrent_part_tasks
    AS SELECT * FROM show_concurrent_part_tasks(); 
  4. pathman_partition_list --
    ヘルパーSRF関数
    CREATE OR REPLACE FUNCTION show_partition_list()
    リターンテーブル (
        parent     REGCLASS,
        partition  REGCLASS,
        parttype   INT4,
        partattr   TEXT,
        range_min  TEXT,
        range_maxテキスト)
    AS 'pg_pathman' 、'show_partition_list_internal'
    言语Cストリクト;
    
    作成または置き換えを行うpathman_partition_list
    AS SELECT * FROM show_partition_list(); 

パーティション管理

  1. 範囲分割を実行します。
    範囲パーティションの作成には、4 つの管理関数を使用します。 開始値、間隔、およびパーティション数の指定には、2 つの関数を使用します。 これらの2つの関数は、次の構文
    を使用して定義できます。create_range_partitions(relation REGCLASS, -- プライマリテーブルのOID) 。
                            attribute      TEXT,      -- The column name of the partition.
                            start_value    ANYELEMENT,  -- The start value.
                            p_interval ANYELEMENT, -- すべてのデータ型の間隔。すべてのタイプのパーティション分割テーブルに適用できます。
                            p_count        INTEGER DEFAULT NULL,   --  The number of partitions.
                            partition_data BOOLEAN DEFAULT TRUE)   --  Specifies whether to immediately migrate data from the primary table to partitions. We recommend that you call the partition_table_concurrently() function to run non-blocking data migration.
    
    create_range_partitions(relation       REGCLASS,  -- The OID of the primary table.
                            attribute      TEXT,      -- The column name of the partition.
                            start_value    ANYELEMENT,  -- The start value.
                            p_interval INTERVAL, -- 間隔データ型の間隔。取り込み時分割テーブルに適用可能です。
                            p_count        INTEGER DEFAULT NULL,   --  The number of partitions.
                            partition_data BOOLEAN DEFAULT TRUE)   --  Specifies whether to immediately migrate data from the primary table to partitions. 非ブロッキングデータ移行を実行するには、partition_table_concurrently() 関数を呼び出すことを推奨します。
    他の 2 つの関数は、開始値、終了値、および間隔の指定に使用します。 次の構文を使用して関数を定義できます:
    create_partitions_from_range (リレーションREGCLASS, -- プライマリテーブルのOID) 。
                                 attribute      TEXT,      -- The column name of the partition.
                                 start_value    ANYELEMENT,  -- The start value.
                                 end_value      ANYELEMENT,  -- The end value.
                                 p_interval ANYELEMENT, -- すべてのデータ型の間隔。すべてのタイプのパーティション分割テーブルに適用できます。
                                 partition_data BOOLEAN DEFAULT TRUE)   --  Specifies whether to immediately migrate data from the primary table to partitions. We recommend that you call the partition_table_concurrently() function to run non-blocking data migration.
    
    create_partitions_from_range(relation       REGCLASS,  -- The OID of the primary table.
                                 attribute      TEXT,      -- The column name of the partition.
                                 start_value    ANYELEMENT,  -- The start value.
                                 end_value      ANYELEMENT,  -- The end value.
                                 p_interval INTERVAL, -- 間隔データ型の間隔。取り込み時分割テーブルに適用可能です。
                                 partition_data BOOLEAN DEFAULT TRUE)   --  Specifies whether to immediately migrate data from the primary table to partitions. 非ブロッキングデータ移行を実行するには、partition_table_concurrently() 関数を呼び出すことを推奨します。
    例:
    パーティション分割が必要なプライマリテーブルを作成します。
    postgres=# create table part_test(id int, info text, crt_time timestamp not null);  -- All partition columns must contain the NOT NULL constraint.  
    テーブルの作成
    
    大量のテストデータを挿入して、すでにデータが含まれているプライマリテーブルをシミュレートします。
    postgres=# part_test select id,md5(random()::text),clock_timestamp() + (id | 'hour'):: generate_series(1,10000) t(id) からの間隔;
    INSERT 0 10000
    postgres=# select * from part_test limit 10;                    
     id | info | crt_time
    ---- + ---------------------------------- + ----------------------------
      1 | 36fe1adedaa5b848caec4941f87d443a | 2016-10-25 10:27:13.206713
      2 | c7d7358e196a9180efb4d0a10269c889 | 2016-10-25 11:27:13.206893
      3 | 005bdb063550579333264b895df5b75e | 2016-10-25 12:27:13.206904
      4 | 6c900a0fc50c6e4da1ae95447c89dd55 | 2016-10-25 13:27:13.20691
      5 | 857214d8999348ed3cb0469b520dc8e5 | 2016-10-25 14:27:13.206916
      6 | 4495875013e96e625afbf2698124ef5b | 2016-10-25 15:27:13.206921
      7 | 82488cf7e44f87d9b879c70a9ed407d4 | 2016-10-25 16:27:13.20693
      8 | a0b92547c8f17f79814dfbb12b8694a0 | 2016-10-25 17:27:13.206936
      9 | 2ca09e0b85042b476fc235e75326b41b | 2016-10-25 18:27:13.206942
     10 | 7eb762e1ef7dca65faf413f236dff93d | 2016-10-25 19:27:13.206947
    (10行)
    
    注:
    1. すべてのパーティション列が NOT NULL 制約付きである必要があります。  
    2. 既存のすべてのレコードに十分対応できるパーティション数とする必要があります。  
    
    パーティションを作成し、各パーティションに1か月のデータが含まれていることを確認します
    postgres=# select
    create_range_partitions('part_test'::regclass, -- プライマリテーブルのOID。
                            'crt_time',                        -- The column name of the partition.
                            '2016-10-25 00:00:00'::timestamp,  -- The start value.
                            interval '1 month', -- 間隔データ型の間隔。取り込み時分割テーブルに適用できます。
                            24,                                -- The number of partitions.
                            false) ;                           -- The data is not migrated.
    NOTICE:  sequence "part_test_seq" does not exist, skipping
     create_range_partitions
    -------------------------
                          24
    (1行)
    postgres-# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_1、
                  part_test_10,
                  part_test_11,
                  part_test_12,
                  part_test_13,
                  part_test_14,
                  part_test_15,
                  part_test_16,
                  part_test_17,
                  part_test_18,
                  part_test_19,
                  part_test_2,
                  part_test_20,
                  part_test_21,
                  part_test_22,
                  part_test_23,
                  part_test_24,
                  part_test_3,
                  part_test_4,
                  part_test_5,
                  part_test_6,
                  part_test_7,
                  part_test_8,
                  part_test_9
    
    
    移行されていないため、データはまだプライマリテーブルにあります。
    postgres=# select count(*) from only part_test;
     カウント
    -------
     10000
    (1行)
    
    
    ノンブロッキングデータ移行を実行します。  
    partition_table_concurrently(relation   REGCLASS,              -- The OID of the primary table.
                                 batch_size INTEGER DEFAULT 1000, -- The number of records to copy from the primary table at a time.
                                 sleep_time FLOAT8 DEFAULT 1.0) − バッチ内の1つ以上の行が他のクエリによってロックされた場合の移行試行間の時間間隔。 pg_pathmanは指定された時間待機し、終了する前に最大60回再試行します。 
    
    
    postgres=# select partition_table_concurrently('part_test'::regclass,
                                 10000,
                                 1.0);
    NOTICE: worker started、次のコマンドで停止できます。select stop_concurrent_part_task('part_test');
     partition_table_concurrent
    ------------------------------
    
    (1行)
    
    
    移行後、すべてのデータがパーティションに移行され、プライマリテーブルは空になります。
    postgres=# select count(*) from only part_test;
     カウント
    -------
         0
    (1行)
    
    
    データの移行後、プライマリテーブルが実行計画に含まれないように、プライマリテーブルを無効にすることをお勧めします。
    postgres=# select set_enable_parent('part_test'::regclass, false);
     set_enable_parent
    -------------------
    
    (1行)
    
    postgres=# explain select * from part_test where crt_time = '2016-10-25 00:00:00 '::timestamp;
                                       クエリ計画
    ---------------------------------------------------------------------------------
     Append  (cost=0.00..16.18 rows=1 width=45)
       ->  Seq Scan on part_test_1  (cost=0.00..16.18 rows=1 width=45)
             フィルター: (crt_time = '2016-10-25 00:00:00 '::timestamp without time zone)
    (3行) 
    説明 範囲分割を使用する場合は、次の項目に注意してください。
    • すべてのパーティション列が NOT NULL 制約付きである必要があります。
    • 既存のすべてのレコードに十分対応できるパーティション数とする必要があります。
    • ノンブロッキングデータ移行を実行します。
    • データ移行の完了後、プライマリテーブルを無効化します。
  2. ハッシュ分割を実行します。
    ハッシュパーティションの作成には、管理関数を使用します。 次の例で説明するように、開始値、間隔、およびパーティション数を指定できます。
    create_hash_partitions(relation REGCLASS, -- プライマリテーブルのOID) 。
                           attribute        TEXT,      -- The column name of the partition.
                           partitions_count INTEGER,   -- The number of partitions to be created.
                           partition_data   BOOLEAN DEFAULT TRUE)   --  Specifies whether to immediately migrate data from the primary table to partitions. 非ブロッキングデータ移行を実行するには、partition_table_concurrently() 関数を呼び出すことを推奨します。
    例:
    パーティション分割が必要なプライマリテーブルを作成します。
    postgres=# create table part_test(id int, info text, crt_time timestamp not null);    -- All partition columns must contain the NOT NULL constraint.  
    テーブルの作成
    
    大量のテストデータを挿入して、すでにデータが含まれているプライマリテーブルをシミュレートします。
    postgres=# part_test select id,md5(random()::text),clock_timestamp() + (id | 'hour'):: generate_series(1,10000) t(id) からの間隔;
    INSERT 0 10000
    postgres=# select * from part_test limit 10;   
     id | info | crt_time
    ---- + ---------------------------------- + ----------------------------
      1 | 29ce4edc70dbfbe78912beb7c4cc95c2 | 2016-10-25 10:47:32.873879
      2 | e0990a6fb5826409667c9eb150fef386 | 2016-10-25 11:47:32.874048
      3 | d25f577a01013925c203910e34470695 | 2016-10-25 12:47:32.874059
      4 | 501419c3f7c218e562b324a1bebfe0ad | 2016-10-25 13:47:32.874065
      5 | 5e5e22bdf110d66a5224a657955ba158 | 2016-10-25 14:47:32.87407
      6 | 55d2d4fd5229a6595e0dd56e13d32be4 | 2016-10-25 15:47:32.874076
      7 | 1dfb9a783af55b123c7a888afe1eb950 | 2016-10-25 16:47:32.874081
      8 | 41eeb0bf395a4ab1e08691125ae74bff | 2016-10-25 17:47:32.874087
      9 | 83783d69cc4f9bb41a3978fe9e13d7fa | 2016-10-25 18:47:32.874092
     10 | affc9406d5b3412ae31f7d7283cda0dd | 2016-10-25 19:47:32.874097
    (10行)
    
    注:
    1. すべてのパーティション列が NOT NULL 制約付きである必要があります。  
    
    128パーティションの作成
    postgres=# select
    create_hash_partitions('part_test'::regclass, -- プライマリテーブルのOID。
                            'crt_time',                        -- The column name of the partition.
                            128,                               -- The number of partitions to be created.
                            false) ;                           -- The data is not migrated.
     create_hash_partitions
    ------------------------
                        128
    (1行)
    
    postgres=# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_0、
                  part_test_1,
                  part_test_10,
                  part_test_100,
                  part_test_101,
                  part_test_102,
                  part_test_103,
                  part_test_104,
                  part_test_105,
                  part_test_106,
                  part_test_107,
                  part_test_108,
                  part_test_109,
                  part_test_11,
                  part_test_110,
                  part_test_111,
                  part_test_112,
                  part_test_113,
                  part_test_114,
                  part_test_115,
                  part_test_116,
                  part_test_117,
                  part_test_118,
                  part_test_119,
                  part_test_12,
                  part_test_120,
                  part_test_121,
                  part_test_122,
                  part_test_123,
                  part_test_124,
                  part_test_125,
                  part_test_126,
                  part_test_127,
                  part_test_13,
                  part_test_14,
                  part_test_15,
                  part_test_16,
                  part_test_17,
                  part_test_18,
                  part_test_19,
                  part_test_2,
                  part_test_20,
                  part_test_21,
                  part_test_22,
                  part_test_23,
                  part_test_24,
                  part_test_25,
                  part_test_26,
                  part_test_27,
                  part_test_28,
                  part_test_29,
                  part_test_3,
                  part_test_30,
                  part_test_31,
                  part_test_32,
                  part_test_33,
                  part_test_34,
                  part_test_35,
                  part_test_36,
                  part_test_37,
                  part_test_38,
                  part_test_39,
                  part_test_4,
                  part_test_40,
                  part_test_41,
                  part_test_42,
                  part_test_43,
                  part_test_44,
                  part_test_45,
                  part_test_46,
                  part_test_47,
                  part_test_48,
                  part_test_49,
                  part_test_5,
                  part_test_50,
                  part_test_51,
                  part_test_52,
                  part_test_53,
                  part_test_54,
                  part_test_55,
                  part_test_56,
                  part_test_57,
                  part_test_58,
                  part_test_59,
                  part_test_6,
                  part_test_60,
                  part_test_61,
                  part_test_62,
                  part_test_63,
                  part_test_64,
                  part_test_65,
                  part_test_66,
                  part_test_67,
                  part_test_68,
                  part_test_69,
                  part_test_7,
                  part_test_70,
                  part_test_71,
                  part_test_72,
                  part_test_73,
                  part_test_74,
                  part_test_75,
                  part_test_76,
                  part_test_77,
                  part_test_78,
                  part_test_79,
                  part_test_8,
                  part_test_80,
                  part_test_81,
                  part_test_82,
                  part_test_83,
                  part_test_84,
                  part_test_85,
                  part_test_86,
                  part_test_87,
                  part_test_88,
                  part_test_89,
                  part_test_9,
                  part_test_90,
                  part_test_91,
                  part_test_92,
                  part_test_93,
                  part_test_94,
                  part_test_95,
                  part_test_96,
                  part_test_97,
                  part_test_98,
                  part_test_99
    
    
    移行されていないため、データはまだプライマリテーブルにあります。
    postgres=# select count(*) from only part_test;
     カウント
    -------
     10000
    (1行)
    
    
    ノンブロッキングデータ移行を実行します。  
    partition_table_concurrently(relation   REGCLASS,              -- The OID of the primary table.
                                 batch_size INTEGER DEFAULT 1000, -- The number of records to copy from the primary table at a time.
                                 sleep_time FLOAT8 DEFAULT 1.0) − バッチ内の1つ以上の行が他のクエリによってロックされた場合の移行試行間の時間間隔。 pg_pathmanは指定された時間待機し、終了する前に最大60回再試行します。 
    
    
    postgres=# select partition_table_concurrently('part_test'::regclass,
                                 10000,
                                 1.0);
    NOTICE: worker started、次のコマンドで停止できます。select stop_concurrent_part_task('part_test');
     partition_table_concurrent
    ------------------------------
    
    (1行)
    
    
    移行後、すべてのデータがパーティションに移行され、プライマリテーブルは空になります。
    postgres=# select count(*) from only part_test;
     カウント
    -------
         0
    (1行)
    
    
    データの移行後、プライマリテーブルが実行計画に含まれないように、プライマリテーブルを無効にすることをお勧めします。
    postgres=# select set_enable_parent('part_test'::regclass, false);
     set_enable_parent
    -------------------
    
    (1行)
    
    単一のパーティションのみを照会します。
    postgres=# explain select * from part_test where crt_time = '2016-10-25 00:00:00'::timestamp;
                                       クエリ計画
    ---------------------------------------------------------------------------------
     Append  (cost=0.00..1.91 rows=1 width=45)
       ->  Seq Scan on part_test_122  (cost=0.00..1.91 rows=1 width=45)
             フィルター: (crt_time = '2016-10-25 00:00:00 '::timestamp without time zone)
    (3行)
    
    次のコンテンツでは、パーティション分割テーブルの制約について説明します。pg_pathmanは自動的に変換を完了します。 For traditional inheritance, expressions similar to select * from part_test where crt_time = '2016-10-25 00:00:00'::timestamp; cannot filter partitions.   
    postgres=# \d+ part_test_122
                                    Table "public.part_test_122"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_122_3_check" CHECK (get_hash_part_idx(timestamp_hash(crt_time), 128) = 122)
    継承: part_test 
    説明 ハッシュ分割を使用する場合は、次の項目に注意してください。
    • すべてのパーティション列が NOT NULL 制約付きである必要があります。
    • ノンブロッキングデータ移行を実行します。
    • データ移行の完了後、プライマリテーブルを無効化します。
    • pg_pathman は式の対象ではありません。 したがって、select * from part_test where crt_time = '2016-10-25 00:00:00:00 '::timestamp; コマンドは、ハッシュ分割にも使用できます。
    • ハッシュパーティション列は、int 型の列に限定されません。 列の型はハッシュ関数によって自動的に変換されます。
  3. データをパーティションに移行します。
    パーティションテーブルの作成時にプライマリテーブルのデータがパーティションテーブルに移行されていない場合、ノンブロッキング移行機能を呼び出すことでデータをパーティションに移行できます。 使用法:
    tmpを (プライマリテーブルの制限から削除xx nowaitを返す *) としてパーティションに挿入select * from tmp
    
    更新のためにプライマリテーブルの制限xxからselect array_agg(ctid) を使用することもできます。 次に、DELETEおよびINSERTステートメントを実行します。 
    次の構文
    を使用して関数を定義できます。partition_table_concurrent (relation REGCLASS, -- プライマリテーブルのOID) 。
                                 batch_size INTEGER DEFAULT 1000, -- The number of records to copy from the primary table at a time.
                                 sleep_time FLOAT8 DEFAULT 1.0) − バッチ内の1つ以上の行が他のクエリによってロックされた場合の移行試行間の時間間隔。 pg_pathmanは指定された時間待機し、終了する前に最大60回再試行します。 
    例:
    postgres=# select partition_table_concurrent ('part_test'::regclass、
                                 10000,
                                 1.0);
    NOTICE: worker started、次のコマンドで停止できます。select stop_concurrent_part_task('part_test');
     partition_table_concurrent
    ------------------------------
    
    (1行) 
    移行タスクを停止するには、次の関数を呼び出します。
    stop_concurrent_part_task(relation REGCLASS)
    バックグラウンドで実行されているデータ移行タスクを確認します。
    postgres=# select * from pathman_concurrent_part_tasks;
     userid | pid | dbid | relid | processed | status
    ------- ----- ------- ---------- ------------------------------
    (0行) 
  4. 範囲パーティションを分割します。
    パーティションが大きすぎて、パーティションを2つのパーティションに分割する場合は、次の方法を使用します。 このメソッドは、範囲分割を使用する場合にのみサポートされます。
    split_range_partition(partition REGCLASS, -- パーティションのOID。
                          split_value    ANYELEMENT,          -- The split value.
                          partition_name TEXT DEFAULT NULL) − 新しいパーティションの名前。
    例:
    postgres=# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_1、
                  part_test_10,
                  part_test_11,
                  part_test_12,
                  part_test_13,
                  part_test_14,
                  part_test_15,
                  part_test_16,
                  part_test_17,
                  part_test_18,
                  part_test_19,
                  part_test_2,
                  part_test_20,
                  part_test_21,
                  part_test_22,
                  part_test_23,
                  part_test_24,
                  part_test_3,
                  part_test_4,
                  part_test_5,
                  part_test_6,
                  part_test_7,
                  part_test_8,
                  part_test_9
    
    postgres=# \d + part_test_1
                                     Table "public.part_test_1"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_1_3_check" CHECK (crt_time >= '2016-10-25 00:00:00 ': タイムゾーンなしのタイムスタンプとcrt_time < '2016-11-25 00:00:00': タイムゾーンなしのタイムスタンプ)
    継承: part_test 
    パーティションを分割します。
    postgres=# select split_range_partition('part_test_1 '::regclass, -- パーティションのOID。
                          '2016-11-10 00:00:00'::timestamp,     -- The split value.
                          'part_test_1_2 '); -- パーティションの名前。
                 split_range_partition
    -----------------------------------------------
     {"2016-10-25 00:00:00","2016-11-25 00:00:00"}
    (1行) 
    テーブルは次の2つのテーブルに分割されます。
    postgres=# \d + part_test_1
                                     Table "public.part_test_1"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_1_3_check" CHECK (crt_time >= '2016-10-25 00:00:00 ': タイムスタンプなしタイムゾーンおよびcrt_time <''2016-11-10 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test
    
    postgres=# \d + part_test_1_2 
                                    Table "public.part_test_1_2"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_1_2_3_check" CHECK (crt_time >= '2016-11-10 00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time <''2016-11-25 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test 
    データは自動的に他のパーティションに移行されます。
    postgres=# select count(*) from part_test_1;
     カウント
    -------
       373
    (1行)
    
    postgres=# part_test_1_2からカウント (*) を選択します。
     カウント
    -------
       360
    (1行) 
    継承関係を次の例に示します。
    postgres=# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_1、
                  part_test_10,
                  part_test_11,
                  part_test_12,
                  part_test_13,
                  part_test_14,
                  part_test_15,
                  part_test_16,
                  part_test_17,
                  part_test_18,
                  part_test_19,
                  part_test_1_2,    -- The added table.
                  part_test_2,
                  part_test_20,
                  part_test_21,
                  part_test_22,
                  part_test_23,
                  part_test_24,
                  part_test_3,
                  part_test_4,
                  part_test_5,
                  part_test_6,
                  part_test_7,
                  part_test_8,
                  part_test_9 
  5. 範囲パーティションをマージします。
    範囲パーティションのみサポートされています。 次の関数を呼び出します。
    マージする2つのパーティションを指定します。  
    merge_range_partitions(partition1 REGCLASS, partition2 REGCLASS) 
    例:
    postgres=# select merge_range_partitions('part_test_2 '::regclass、'part_test_12'::regclass) ;
    エラー: マージに失敗しました。パーティションは隣接している必要があります
    コンテキスト: PL/pgSQL関数merge_range_partitions_internal(regclass、regclass、regclass、anyelement) 27行目 (RAISE)
    SQLステートメント「SELECT public.merge_range_partitions_internal($1、$2、$3、NULL:: タイムスタンプなしタイムゾーン) 」
    EXECUTEのPL/pgSQL関数merge_range_partitions(regclass、regclass) 44行目
    パーティションが隣接していないため、エラーが返されます。
    
    Adjacent partitions can be merged.
    postgres=# select merge_range_partitions('part_test_1'::regclass, 'part_test_1_2'::regclass) ;
     merge_range_partitions
    ------------------------
    
    (1行) 
    マージが完了すると、パーティションの1つが削除されます。
    postgres=# \d part_test_1_2
    "part_test_1_2" というリレーションが見つかりませんでした。
    
    postgres=# \d part_test_1
                 Table "public.part_test_1"
      列 | タイプ | 修飾子
    --------- ----------------------------- --------------
     id       | integer                     | 
     info     | text                        | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない
    チェック制約:
        "pathman_part_test_1_3_check" CHECK (crt_time >= '2016-10-25 00:00:00 ': タイムゾーンなしのタイムスタンプとcrt_time < '2016-11-25 00:00:00': タイムゾーンなしのタイムスタンプ)
    継承: part_test
    
    postgres=# part_test_1からカウント (*) を選択します。
     カウント
    -------
       733
    (1行) 
  6. 最後のパーティションの後にレンジパーティションを追加します。

    パーティション分割されたプライマリテーブルのパーティションを追加するには、いくつかの方法を使用できます。 最後のパーティションの後にパーティションを追加する方法もそのひとつです。

    新しいパーティションが追加されると、パーティションテーブルが最初に作成されたときに指定された間隔が使用されます。 pathman_configコマンドを実行すると、最初に作成された各パーティションテーブルの間隔を照会できます。
    postgres=# select * from pathman_config;
      partrel | attname | parttype | range_interval
    ---------- --------------------------- ----------------
     part_test | crt_time | 2 | 1 mon
    (1行) 
    新しい範囲パーティションを追加します (テーブルスペースは指定できません)。
    append_range_partition (親REGCLASS, -- プライマリテーブルのOID。
                           partition_name TEXT DEFAULT NULL, -- 新しいパーティションの名前。 このパラメーターは必須ではありません。
                           tablespace TEXT DEFAULT NULL) − 新しいパーティションが格納されるテーブルスペース。 このパラメーターは必要ありません。
    例:
    postgres=# select append_range_partition('part_test'::regclass);
     append_range_partition
    ------------------------
     public.part_test_25
    (1行)
    
    postgres=# \d + part_test_25
                                    Table "public.part_test_25"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_25_3_check" CHECK (crt_time >= '2018-10-25 00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time <''2018-11-25 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test
    
    postgres=# \d + part_test_24
                                    Table "public.part_test_24"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_24_3_check" CHECK (crt_time >= '2018-09-25 00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time < '2018-10-25 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test 
  7. パーティションの先頭にレンジパーティションを追加します。
    テーブルの先頭にパーティションを追加するには、次
    の構文を使用します。
                            partition_name TEXT DEFAULT NULL,
                            tablespace TEXT DEFAULT NULL) 
    例:
    postgres=# select prepend_range_partition('part_test'::regclass);
     prepend_range_partition
    -------------------------
     public.part_test_26
    (1行)
    
    postgres=# \d + part_test_26
                                    Table "public.part_test_26"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_26_3_check" CHECK (crt_time >= '2016-09-25 00:00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time < ' 2016-10-25 00:00:00 ': タイムスタンプなしタイムゾーン)
    継承: part_test
    
    postgres=# \d + part_test_1
                                     Table "public.part_test_1"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_1_3_check" CHECK (crt_time >= '2016-10-25 00:00:00 ': タイムゾーンなしのタイムスタンプとcrt_time < '2016-11-25 00:00:00': タイムゾーンなしのタイムスタンプ)
    継承: part_test 
  8. パーティションを追加します。
    パーティションの開始値を指定して、新しいパーティションを作成できます。 範囲が既存のパーティションと重複しない場合は、新しいパーティションを作成できます。 この方法では、非連続パーティションを作成できます。 たとえば、既存のパーティションの範囲が2010から2015の場合、2020からパーティションを作成できます。 2015 から 2020 の間のパーティションを作成する必要はありません。 次の構文を使用します:
    add_range_partition(relation REGCLASS, -- プライマリテーブルのOID。
                        start_value    ANYELEMENT,  -- The start value.
                        end_value      ANYELEMENT,  -- The end value.
                        partition_name TEXT DEFAULT NULL,  -- The name of the partition.
                        tablespace TEXT DEFAULT NULL) -- パーティションが存在するテーブルスペースの名前。
    例:
    postgres=# select add_range_partition('part_test'::regclass, -- プライマリテーブルのOID。
                        '2020-01-01 00:00:00'::timestamp,  -- The start value.
                        '2020-02-01 00:00:00'::timestamp); -- The end value.
     add_range_partition
    ---------------------
     public.part_test_27
    (1行)
    
    postgres=# \d + part_test_27
                                    Table "public.part_test_27"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_27_3_check" CHECK (crt_time >= '2020-01-01 00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time < '2020-02-01 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test 
  9. パーティションを削除します。
    単一のパーティション範囲を削除するには、次の関数
    を呼び出します。drop_range_partition(partition TEXT, -- 削除するパーティションの名前。
                        delete_data BOOLEAN DEFAULT TRUE) -- Specifies whether to delete the data of the partition. If you set the value to FALSE, the data of the partition is migrated to the primary table.   
    
    delete_dataがtrueの場合、RANGEパーティションとそのすべてのデータをドロップします。
    例:
    パーティションを削除し、パーティションのデータをプライマリテーブルに移行します。  
    postgres=# select drop_range_partition('part_test_1 '、false);
    注意: part_test_1からコピーされた733行
     drop_range_partition
    ----------------------
     part_test_1
    (1行)
    
    postgres=# select drop_range_partition('part_test_2 '、false);
    注意: part_test_2からコピーされた720行
     drop_range_partition
    ----------------------
     part_test_2
    (1行)
    
    postgres=# part_testからカウント (*) を選択します。
     カウント
    -------
     10000
    (1行)
    
    データをプライマリテーブルに移行せずに、パーティションとパーティションのデータを削除します。  
    postgres=# select drop_range_partition('part_test_3',true);
     drop_range_partition
    ----------------------
     part_test_3
    (1行)
    
    postgres=# part_testからカウント (*) を選択します。
     カウント
    -------
      9256
    (1行)
    
    postgres=# part_testのみからカウント (*) を選択します。
     カウント
    -------
      1453
    (1行) 
    すべてのパーティションを削除し、データをプライマリテーブルに移行するかどうかを指定します。 次の構文を使用します。
    drop_partitions (親REGCLASS、
                    delete_data BOOLEAN DEFAULT FALSE)
    
    親テーブルのパーティション (外部関係とローカル関係の両方) を削除します。 
    If delete_data is false, the data is copied to the parent table first. 
    デフォルトはfalseです。
    例:
    postgres=# select drop_partitions('part_test'::regclass, false); -- すべてのパーティションを削除し、データをプライマリテーブルに移行します。
    注意: 関数public.part_test_upd_trig_func() が存在しません。注意: part_test_4からコピーされた744行
    注意: part_test_5からコピーされた672行
    注意: part_test_6からコピーされた744行
    注意: part_test_7からコピーされた720行
    注意: part_test_8からコピーされた744行
    注意: part_test_9からコピーされた720行
    注意: part_test_10からコピーされた744行
    注意: part_test_11からコピーされた744行
    注意: part_test_12からコピーされた720行
    注意: part_test_13からコピーされた744行
    注意: part_test_14からコピーされた507行
    注意: part_test_15からコピーされた0行
    注意: part_test_16からコピーされた0行
    注意: part_test_17からコピーされた0行
    注意: part_test_18からコピーされた0行
    注意: part_test_19からコピーされた0行
    注意: part_test_20からコピーされた0行
    注意: part_test_21からコピーされた0行
    注意: part_test_22からコピーされた0行
    注意: part_test_23からコピーされた0行
    注意: part_test_24からコピーされた0行
    注意: part_test_25からコピーされた0行
    注意: part_test_26からコピーされた0行
    注意: part_test_27からコピーされた0行
     drop_partitions
    -----------------
                  24
    (1行)
    
    postgres=# part_testからカウント (*) を選択します。
     カウント
    -------
      9256
    (1行)
    
    postgres=# \dt part_test_4
    一致する関係は見つかりませんでした。
  10. テーブルをパーティションにアタッチします。
    テーブルをパーティション分割されたプライマリテーブルにアタッチします。 テーブルには、プライマリテーブルと同じスキーマが必要です。 たとえば、2つのテーブルは同じドロップ列を持つ必要があります。 pg_attributeパラメーターは、テーブルのスキーマを指定します。 次の構文を使用します:
    attach_range_partition(relation REGCLASS, -- プライマリテーブルのOID。
                           パーティションREGCLASS, -- パーティションのOID。
                           start_value ANYELEMENT,  -- The start value.
                           end_value ANYELEMENT) − 開始値。
    例:
    postgres=# create table part_test_1 (すべてを含むpart_testなど);
    テーブルの作成
    postgres=# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    
    postgres=# \d + part_test_1
                                     Table "public.part_test_1"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    
    postgres=# select attach_range_partition('part_test'::regclass, 'part_test_1 '::regclass, '2019-01-01 00:00:00'::timestamp, '2019-02-01 00:00:00:00 ': timestamp);
     attach_range_partition
    ------------------------
     part_test_1
    (1行)
    
    テーブルが添付されると、継承関係と制約は自動的に作成されます。  
    postgres=# \d+ part_test_1
                                     Table "public.part_test_1"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_1_3_check" CHECK (crt_time >= '2019-01-01 00:00:00 ': タイムゾーンなしのタイムスタンプとcrt_time < '2019-02-01 00:00:00': タイムゾーンなしのタイムスタンプ)
    継承: part_test 
  11. プライマリテーブルからパーティションをデタッチします (パーティションを通常のテーブルに変換します) 。
    プライマリテーブルの継承からパーティションを削除します。 データは削除されません。 継承と制約が削除されます。 次の構文を使用します。
    detach_range_partition(partition REGCLASS) -- パーティションの名前を指定し、パーティションを通常のテーブルに変換します。
    例:
    part_testからpostgres=# select count(*);
     カウント
    -------
      9256
    (1行)
    
    postgres=# part_test_2からカウント (*) を選択します。
     カウント
    -------
       733
    (1行)
    
    postgres=# select detach_range_partition('part_test_2 ');
     detach_range_partition
    ------------------------
     part_test_2
    (1行)
    
    postgres=# part_test_2からカウント (*) を選択します。
     カウント
    -------
       733
    (1行)
    
    postgres=# part_testからカウント (*) を選択します。
     カウント
    -------
      8523
    (1行) 
  12. パーティションテーブルのpg_pathmanプラグインを完全に無効にします。
    単一の分割されたプライマリテーブルの pg_pathman プラグインを無効化できます。 次の構文を使用して関数を定義します。
    disable_pathman_for(relation TEXT)
    
    指定された親テーブルのpg_pathmanパーティショニングメカニズムを完全に無効にし、挿入トリガーが存在する場合は削除します。 
    All partitions and data remain unchanged.
    
    postgres=# \sf disable_pathman_for
    CREATE OR REPLACE FUNCTION public.disable_pathman_for (parent_rerid regclass)
     RETURNS void
     LANGUAGE plpgsql
     厳格
    AS $function $
    開始
            PERFORM public.validate_relname(parent_relid);
    
            DELETE FROM public.pathman_config WHERE partrel = parent_relid;
            PERFORM public.drop_triggers(parent_relid);
    
            /* Notify backend about changes */
            PERFORM public.on_remove_partitions(parent_relid);
    終了
    $function$ 
    例:
    postgres=# select disable_pathman_for('part_test');
    注意: カスケードを他の23個のオブジェクトにドロップする
    詳細: カスケードをドロップして、テーブルpart_test_3でpart_test_upd_trigをトリガーします
    カスケードをドロップしてテーブルpart_test_4でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_5でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_6でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_7でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_8でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_9でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_10でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_11でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_12でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_13にpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_14でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_15にpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_16でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_17でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_18にpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_19でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_20でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_21でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_22でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_23にpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_24でpart_test_upd_trigをトリガーする
    カスケードをドロップしてテーブルpart_test_25でpart_test_upd_trigをトリガーする
     disable_pathman_for
    ---------------------
    
    (1行)
    
    postgres=# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_10、
                  part_test_11,
                  part_test_12,
                  part_test_13,
                  part_test_14,
                  part_test_15,
                  part_test_16,
                  part_test_17,
                  part_test_18,
                  part_test_19,
                  part_test_20,
                  part_test_21,
                  part_test_22,
                  part_test_23,
                  part_test_24,
                  part_test_25,
                  part_test_26,
                  part_test_27,
                  part_test_28,
                  part_test_29,
                  part_test_3,
                  part_test_30,
                  part_test_31,
                  part_test_32,
                  part_test_33,
                  part_test_34,
                  part_test_35,
                  part_test_4,
                  part_test_5,
                  part_test_6,
                  part_test_7,
                  part_test_8,
                  part_test_9
    
    postgres=# \d + part_test_10
                                    Table "public.part_test_10"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_10_3_check" CHECK (crt_time >= '2017-06-25 00:00:00 ': タイムスタンプなしタイムゾーンおよびcrt_time <''2017-07-25 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test 
    pg_pathman プラグインを無効にしても、継承と制約は変更されません。 pg_pathman プラグインは、カスタムスキャン実行プランに介入しません。 pg_pathmanプラグインが無効になった後の実行計画:
    postgres=# explain select * from part_test where crt_time='2017-06-25 00:00:00:00 '::timestamp;
                                       クエリ計画
    ---------------------------------------------------------------------------------
     Append  (cost=0.00..16.00 rows=2 width=45)
       ->  Seq Scan on part_test  (cost=0.00..0.00 rows=1 width=45)
             Filter: (crt_time = '2017-06-25 00:00:00'::timestamp without time zone)
       ->  Seq Scan on part_test_10  (cost=0.00..16.00 rows=1 width=45)
             フィルター: (crt_time = '2017-06-25 00:00:00 ': タイムゾーンなしのタイムスタンプ)
    (5行) 
    重要 disable_pathman_for操作は不可逆的です。 作業は慎重に行ってください。

高度なパーティション管理

  1. プライマリテーブルを無効化する
    プライマリテーブルの全データをパーティションに移行後、プライマリテーブルを無効にできます。 次の構文を使用して関数を定義します:
    set_enable_parent(relation REGCLASS, value BOOLEAN)
    
    
    親テーブルをクエリプランに /から含める /除外します。 
    
    In original PostgreSQL planner parent table is always included into query plan even if it's empty which can lead to additional overhead. 
    
    You can use disable_parent() if you are never going to use parent table as a storage. 
    
    Default value depends on the partition_data parameter that was specified during initial partitioning in create_range_partitions() or create_partitions_from_range() functions. 
    
    If the partition_data parameter was true then all data have already been migrated to partitions and parent table disabled. 
    
    それ以外の場合は有効になります。
    例:
    select set_enable_parent('part_test', false);
  2. 自動パーティション伝播
    レンジパーティションテーブルでは、自動パーティション伝播がサポートされています。 挿入されたデータが既存のパーティションの範囲を超える場合、パーティションが自動的に作成されます。
    set_auto (リレーションREGCLASS, value BOOLEAN)
    
    自動パーティションの伝播を有効 /無効にします (RANGEパーティション分割のみ) 。 
    
    デフォルトで有効になっています。
    例:
    postgres=# \d + part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_10、
                  part_test_11,
                  part_test_12,
                  part_test_13,
                  part_test_14,
                  part_test_15,
                  part_test_16,
                  part_test_17,
                  part_test_18,
                  part_test_19,
                  part_test_20,
                  part_test_21,
                  part_test_22,
                  part_test_23,
                  part_test_24,
                  part_test_25,
                  part_test_26,
                  part_test_3,
                  part_test_4,
                  part_test_5,
                  part_test_6,
                  part_test_7,
                  part_test_8,
                  part_test_9
    
    postgres=# \d + part_test_26
                                    Table "public.part_test_26"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_26_3_check" CHECK (crt_time >= '2018-09-25 00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time < '2018-10-25 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test
    
    postgres=# \d + part_test_25
                                    Table "public.part_test_25"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    チェック制約:
        "pathman_part_test_25_3_check" CHECK (crt_time >= '2018-08-25 00:00:00 ': タイムスタンプなしタイムゾーンとcrt_time < '2018-09-25 00:00:00': タイムスタンプなしタイムゾーン)
    継承: part_test
    
    挿入する値がすべての既存のレンジパーティションを超えている場合、テーブルがパーティション分割される間隔に基づいていくつかの新しいパーティションが作成されます。 この操作には長い時間がかかる場合があります。   
    postgres=# part_test値に挿入 (1、'test' 、'2222-01-01 '::timestamp);
    
    データが挿入された後、挿入された値の範囲が大きいため、多数のパーティションが作成されます。   
    
    postgres=# \d+ part_test
                                      Table "public.part_test"
      列 | タイプ | モディファイア | ストレージ | 統計ターゲット | 説明
    ---------- ----------------------------- ------------------------------------------------------------------
     id       | integer                     |           | plain    |              | 
     info     | text                        |           | extended |              | 
     crt_time | タイムゾーンなしのタイムスタンプ | nullではない | プレーン | |
    子テーブル: part_test_10、
                  part_test_100,
                  part_test_1000,
                  part_test_1001,
            .....................................
            多数のパーティション 
    説明 不適切な自動連続分割は時間を浪費する可能性があるため、自動連続分割は無効化することを推奨します。
  3. パーティションの作成ごとにトリガーされるコールバック関数
    コールバック関数は、パーティションが作成されるたびに自動的にトリガーされる関数です。 たとえば、論理レプリケーションを実行してステートメントをテーブルに格納する DDL ステートメントをコールバック関数で記録できます。 次の構文を使用して、コールバック関数を定義します。
    set_init_callback(relation REGCLASS, callback REGPROC DEFAULT 0)
    
    アタッチされたパーティションまたは作成されたパーティション (HASHとRANGEの両方) ごとに呼び出されるパーティション作成コールバックを設定します。 
    
    コールバックには次の署名が必要です。part_init_callback(args JSONB) RETURNS VOID。 
    
    パラメータargは、パーティションの種類に応じて存在する複数のフィールドで構成されます。/* RANGEパーティション分割テーブルabc (子abc_4) * /
    {
        "parent":    "abc",
        "parttype":  "2",
        "partition": "abc_4",
        "range_max": "401",
        "range_min": "301"
    }
    
    /* HASHパーティション分割テーブルabc (子abc_0) * /
    {
        "parent":    "abc",
        "parttype":  "1",
        "partition": "abc_0"
    } 
    例:
    コールバック関数
    postgres=# createまたはreplace関数f_callback_test(jsonb) は、$$
    宣言
    始める
      create table if not exists rec_part_ddl(id serial primary key, parent name, parttype int, partition name, range_max text, range_min text);
      if ($1->>'parttype')::int = 1 then
        raise notice 'parent: %, parttype: %, partition: %', $1->>'parent', $1->>'parttype', $1->>'partition';
        insert into rec_part_ddl(parent, parttype, partition) values (($1->>'parent')::name, ($1->>'parttype')::int, ($1->>'partition')::name);
      elsif ($1->>'parttype')::int = 2 then
        raise notice 'parent: %, parttype: %, partition: %, range_max: %, range_min: %', $1->>'parent', $1->>'parttype', $1->>'partition', $1->>'range_max', $1->>'range_min';
        insert into rec_part_ddl(parent, parttype, partition, range_max, range_min) values (($1->>'parent')::name, ($1->>'parttype')::int, ($1->>'partition')::name, $1->>'range_max', $1->>'range_min');
      終了if;
    終了;
    $$ language plpgsql strict;
    
    テストテーブル
    postgres=# create table tt(id int, info text, crt_time timestamp not null);
    テーブルの作成
    
    テストテーブルのコールバック関数を設定します。
    select set_init_callback('tt'::regclass, 'f_callback_test '::regproc);
    
    パーティションの作成
    postgres=# select
    create_range_partitions('tt'::regclass, -- プライマリテーブルのOID。
                            'crt_time',                        -- The column name of the partition.
                            '2016-10-25 00:00:00'::timestamp,  -- The start value.
                            interval '1 month', -- 間隔データ型の間隔。取り込み時分割テーブルに適用できます。
                            24,                                -- The number of partitions.
                            false) ;
     create_range_partitions
    -------------------------
                          24
    (1行)
    
    コールバック関数が呼び出されているかどうかを確認します。  
    postgres=# select * from rec_part_ddl;
     id | 親 | parttype | パーティション | range_max | range_min
    --- -------- -------------------------------- --------------------- ---------------------
      1 | tt     |        2 | tt_1      | 2016-11-25 00:00:00 | 2016-10-25 00:00:00
      2 | tt     |        2 | tt_2      | 2016-12-25 00:00:00 | 2016-11-25 00:00:00
      3 | tt     |        2 | tt_3      | 2017-01-25 00:00:00 | 2016-12-25 00:00:00
      4 | tt     |        2 | tt_4      | 2017-02-25 00:00:00 | 2017-01-25 00:00:00
      5 | tt     |        2 | tt_5      | 2017-03-25 00:00:00 | 2017-02-25 00:00:00
      6 | tt     |        2 | tt_6      | 2017-04-25 00:00:00 | 2017-03-25 00:00:00
      7 | tt     |        2 | tt_7      | 2017-05-25 00:00:00 | 2017-04-25 00:00:00
      8 | tt     |        2 | tt_8      | 2017-06-25 00:00:00 | 2017-05-25 00:00:00
      9 | tt     |        2 | tt_9      | 2017-07-25 00:00:00 | 2017-06-25 00:00:00
     10 | tt     |        2 | tt_10     | 2017-08-25 00:00:00 | 2017-07-25 00:00:00
     11 | tt     |        2 | tt_11     | 2017-09-25 00:00:00 | 2017-08-25 00:00:00
     12 | tt     |        2 | tt_12     | 2017-10-25 00:00:00 | 2017-09-25 00:00:00
     13 | tt     |        2 | tt_13     | 2017-11-25 00:00:00 | 2017-10-25 00:00:00
     14 | tt     |        2 | tt_14     | 2017-12-25 00:00:00 | 2017-11-25 00:00:00
     15 | tt     |        2 | tt_15     | 2018-01-25 00:00:00 | 2017-12-25 00:00:00
     16 | tt     |        2 | tt_16     | 2018-02-25 00:00:00 | 2018-01-25 00:00:00
     17 | tt     |        2 | tt_17     | 2018-03-25 00:00:00 | 2018-02-25 00:00:00
     18 | tt     |        2 | tt_18     | 2018-04-25 00:00:00 | 2018-03-25 00:00:00
     19 | tt     |        2 | tt_19     | 2018-05-25 00:00:00 | 2018-04-25 00:00:00
     20 | tt     |        2 | tt_20     | 2018-06-25 00:00:00 | 2018-05-25 00:00:00
     21 | tt     |        2 | tt_21     | 2018-07-25 00:00:00 | 2018-06-25 00:00:00
     22 | tt     |        2 | tt_22     | 2018-08-25 00:00:00 | 2018-07-25 00:00:00
     23 | tt     |        2 | tt_23     | 2018-09-25 00:00:00 | 2018-08-25 00:00:00
     24 | tt | 2 | tt_24 | 2018-10-25 00:00:00 | 2018-09-25 00:00:00
    (24行)