PGD AutoPartition#
PGD AutoPartitionを使用すると、テーブルを複数のパーティションに分割できます。自動パーティション管理を使用して、テーブルを大きなサイズに簡単に拡張できます。この機能は、パーティションの作成と削除の低競合ロックなどのPGDの機能を使用します。
新しいパーティションを定期的に作成し、データ保持期間の有効期限が切れたら削除できます。
PGD管理は、主にSQLで呼び出すことができるファンクションを使用して実行します。
PGDのすべてのファンクションはbdr スキーマで公開されています。
search_pathに配置しない限り、各ファンクションの名前をスキーマ修飾する必要があります。
パーティションの自動作成#
PGD AutoPartitionは bdr.autopartition() を使用します
テーブルの自動レンジパーティションの定義を作成または変更するファンクション。定義が存在しない場合、作成されます。それ以外の場合、後の実行で定義が変更されます。
PGD 5.5以降のPGD AutoPartitionは、基になるPostgres機能を活用して、テーブルの残りの部分をロックせずにパーティションをアタッチまたはデタッチ/ドロップできます。 5.5より前のバージョンのPGDはこの機能をサポートしておらず、テーブルをロックします。
テーブルがRANGEパーティション化されていない場合、または複数列パーティションキーが使用されている場合、エラーが発生します。
デフォルトでは、AutoPartitionはパーティションをグローバルに管理します。つまり、1つのノードでパーティションが作成されると、クラスター内の他のすべてのノードで同じパーティションが作成されます。デフォルトを使用すると、すべてのパーティションに一貫性があり、使用できることが保証されます。この機能のために、AutoPartitionはRaftを利用します。
managed_locally をtrue
に設定することにより、この動作を変更できます。その場合、すべてのパーティションは各ノードでローカルに管理されます。パーティションのローカルでの管理は、パーティション化されたテーブルがレプリケートテーブルでない場合に役立ちます。その場合、すべてのノードにすべてのパーティションを必要としないか、したくない場合があります。例、ビルトイン bdr.conflict_history
テーブルはレプリケートテーブルではありません。これはAutoPartitionによってローカルに管理されます。各ノードはこのテーブルのパーティションをローカルに作成し、十分に古くなると削除します。
次のことも考慮します。
managed_locallyとしてマークされたテーブルをグローバルに管理するように後で変更することはできません。その逆も可能です。アクティビティは、エントリーが
enabled = onとマークされている場合にのみ実行されます。AutoPartitionによって管理されるテーブルのパーティションを手動で作成または削除しないことをお勧めします。そうすると、AutoPartitionメタデータの一貫性がなくなり、障害が発生する可能性があります。
AutoPartitionの例#
日次パーティション、データを1か月間保持します
CREATE TABLE measurement (
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
bdr.autopartition(measurement, 1 day, data_retention_period := 30 days);
パーティションがあと2つだけ残っている場合、5つの事前パーティションを作成します。各パーティションには、10億の注文を保持できます。
bdr.autopartition(Orders, 1000000000,
partition_initial_lowerbound := 0,
minimum_advance_partitions := 2,
maximum_advance_partitions := 5
);
RANGEパーティションテーブル#
partition_increment
値の範囲ごとに新しいパーティションが追加されます。
下限と上限はpartition_increment 離れています。 timestamp
またはdate タイプのパーティションキーを持つテーブルの場合、
partition_increment はinterval
タイプの有効な定数である必要があります。たとえば、 1 Day
を指定すると、新しいパーティションが毎日追加され、パーティション境界は1日ごとに追加されます。
パーティション列がsnowflakeid 、timeshard
、またはksuuid
シーケンスに接続されている場合、partition_increment
をinterval
タイプとして指定する必要があります。それ以外の場合、パーティションキーが整数または数値の場合、
partition_increment
は同じデータ型の有効な定数である必要があります。たとえば、 1000000
を指定すると、100万の値ごとに新しいパーティションが追加されます。
テーブルに既存のパーティションがない場合、指定されたpartition_initial_lowerbound
が最初のパーティションの下限として使用されます。
partition_initial_lowerbound
を指定しない場合、システムはパーティション列タイプと指定されたpartition_increment
からその値を導き出そうとします。たとえば、 partition_increment
が1 Day として指定されている場合、
partition_initial_lowerbound はCURRENT DATEに設定されます。
partition_increment が1 Hour として指定される場合、
partition_initial_lowerbound
は現在の日付の現在時間に設定されます。後続のパーティションの境界は、partition_increment
値を使用して設定されます。
システムは常に特定の最小数の事前パーティションを持とうとします。新しいパーティションを作成するかどうかを決定するために、指定されたpartition_autocreate_expression
を使用します。これは、チェックが実行されるたびに評価されるSQLによって評価できる式です。たとえば、列タイプdate
のパーティションテーブルの場合、partition_autocreate_expression
がDATE_TRUNC('day',CURRENT_DATE)
として指定され、partition_increment が1 Day
として指定され、minimum_advance_partitions が2
として指定されるとします。次に、最後のパーティションの上限がDATE_TRUNC('day', CURRENT_DATE) + '2 Days'::interval
未満になるまで、新しいパーティションが作成されます。
式は、システムが新しいパーティションをチェックするたびに評価されます。
列タイプinteger
のパーティションテーブルの場合、partition_autocreate_expression
をSELECT max(partcol) FROM schema.partitioned_table
として指定できます。次に、システムは、パーティション化された列の最大値が最後のパーティションの上限のminimum_advance_partitions * partition_increment
の距離内にあるかどうかを定期的にチェックします。クエリーが効率的に実行されるように、
partcol にインデックスを作成します。カラムタイプinteger
、smallint 、またはbigint
のパーティションテーブルにpartition_autocreate_expression
を指定しない場合、システムはmax(partcol) に設定します。
data_retention_period
が設定されている場合、パーティションはこの期間の後にドロップされます。ロックを最小限に抑えるために、新しいパーティションが追加されると同時にパーティションが削除されます。この値を設定しない場合、パーティションを手動で削除する必要があります。
data_retention_period
パラメーターは、タイムスタンプベースおよび関連するパーティションでのみサポートされています。期間は、パーティションの上限を考慮して計算されます。上限と比較して、指定された期間が満了すると、パーティションはドロップされます。
パーティションの自動作成の停止#
bdr.drop_autopartition() を使用する
指定されたリレーションの自動パーティションルールを削除します。リレーションの保留中の作業項目はすべて削除され、新しい作業項目は作成されません。
パーティションの作成を待機しています#
パーティションの作成は非同期プロセスです。 AutoPartitionは、ローカルまたはすべてのノードでパーティションが作成されるのを待機する一連の機能を提供します。
bdr.autopartition_wait_for_partitions() を使用する
ローカルノードでパーティションの作成を待機します。ファンクションは、パーティションテーブル名とパーティションキー列値を取得し、その値を保持するパーティションが作成されるまで待機します。
このファンクションは、パーティションがローカルに作成されるのをのみ待機します。パーティションがリモートノードにも存在することは保証されません。
すべてのPGDノードでパーティションが作成されるのを待機するには、 bdr.autopartition_wait_for_partitions_on_all_nodes() を使用します
ファンクション。このファンクションは、ローカルノードとすべてのリモートノードを内部的にチェックし、パーティションがどこでも作成されるまで待機します。
パーティションの検索#
bdr.autopartition_find_partition() を使用します
指定されたパーティションキー値のパーティションを見つけるファンクション。その値を保持するパーティションが存在しない場合、ファンクションはNULLを結果ます。それ以外の場合、パーティションのOidを結果ます。
自動パーティショニングの有効化または無効化#
bdr.autopartition_enable() を使用する
指定されたテーブルで自動パーティション化を有効にします。自動パーティション化が既に有効になっている場合、アクションは発生しません。同様に、 bdr.autopartition_disable() を使用します
指定されたテーブルで自動パーティショニングを無効にします。
EDB Postgres Advanced Serverの制限 -ネイティブの自動パーティショニング#
EDB Postgres Advanced Serverネイティブの自動パーティショニングは、PGDではサポートされていません。
PGD拡張機能がEDB Postgres Advanced
Serverデータベースでアクティブな場合、 EDB Postgres Advanced
Server自動パーティションALTER TABLE ... SET AUTOMATIC
およびALTER TABLE ... SET INTERVAL
を構成するDDLコマンドは拒否されます。
EDB Postgres Advanced EDB Postgres Advanced Serverネイティブの自動パーティショニングを使用するように構成されたテーブルを含むEDB Postgres Advanced ServerデータベースでPGD拡張機能を有効にすることは可能ですが、このノードをソースノードとして使用してさらにノードに参加することはできません。
次のいずれかのコマンドを使用して、 EDB Postgres Advanced Serverネイティブの自動パーティショニングを無効にできます。
ALTER TABLE ... SET MANUALリストパーティションテーブルの場合ALTER TABLE ... SET INTERVAL ()インターバルパーティションテーブルの場合