このトピックでは、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プラグインは、関数を使用してパーティションテーブルを維持し、次の例で説明するように、パーティションテーブルのステータスを表示できるビューを作成します。
- 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)) /* 許可されたパーツタイプのチェック */ );
- 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。
- 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();
- 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();
パーティション管理
- 範囲分割を実行します。 範囲パーティションの作成には、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 制約付きである必要があります。
- 既存のすべてのレコードに十分対応できるパーティション数とする必要があります。
- ノンブロッキングデータ移行を実行します。
- データ移行の完了後、プライマリテーブルを無効化します。
- ハッシュ分割を実行します。 ハッシュパーティションの作成には、管理関数を使用します。 次の例で説明するように、開始値、間隔、およびパーティション数を指定できます。
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 型の列に限定されません。 列の型はハッシュ関数によって自動的に変換されます。
- データをパーティションに移行します。 パーティションテーブルの作成時にプライマリテーブルのデータがパーティションテーブルに移行されていない場合、ノンブロッキング移行機能を呼び出すことでデータをパーティションに移行できます。 使用法:
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行)
- 範囲パーティションを分割します。 パーティションが大きすぎて、パーティションを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
- 範囲パーティションをマージします。 範囲パーティションのみサポートされています。 次の関数を呼び出します。
マージする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行)
- 最後のパーティションの後にレンジパーティションを追加します。
パーティション分割されたプライマリテーブルのパーティションを追加するには、いくつかの方法を使用できます。 最後のパーティションの後にパーティションを追加する方法もそのひとつです。
新しいパーティションが追加されると、パーティションテーブルが最初に作成されたときに指定された間隔が使用されます。 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
- パーティションの先頭にレンジパーティションを追加します。 テーブルの先頭にパーティションを追加するには、次
の構文を使用します。 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
- パーティションを追加します。 パーティションの開始値を指定して、新しいパーティションを作成できます。 範囲が既存のパーティションと重複しない場合は、新しいパーティションを作成できます。 この方法では、非連続パーティションを作成できます。 たとえば、既存のパーティションの範囲が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
- パーティションを削除します。 単一のパーティション範囲を削除するには、次の関数
を呼び出します。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 一致する関係は見つかりませんでした。
- テーブルをパーティションにアタッチします。 テーブルをパーティション分割されたプライマリテーブルにアタッチします。 テーブルには、プライマリテーブルと同じスキーマが必要です。 たとえば、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
- プライマリテーブルからパーティションをデタッチします (パーティションを通常のテーブルに変換します) 。 プライマリテーブルの継承からパーティションを削除します。 データは削除されません。 継承と制約が削除されます。 次の構文を使用します。
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行)
- パーティションテーブルの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
操作は不可逆的です。 作業は慎重に行ってください。
高度なパーティション管理
- プライマリテーブルを無効化する プライマリテーブルの全データをパーティションに移行後、プライマリテーブルを無効にできます。 次の構文を使用して関数を定義します:
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);
- 自動パーティション伝播 レンジパーティションテーブルでは、自動パーティション伝播がサポートされています。 挿入されたデータが既存のパーティションの範囲を超える場合、パーティションが自動的に作成されます。
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, ..................................... 多数のパーティション
説明 不適切な自動連続分割は時間を浪費する可能性があるため、自動連続分割は無効化することを推奨します。 - パーティションの作成ごとにトリガーされるコールバック関数 コールバック関数は、パーティションが作成されるたびに自動的にトリガーされる関数です。 たとえば、論理レプリケーションを実行してステートメントをテーブルに格納する 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行)