AutoPartition

AutoPartitionを使用すると、テーブルをいくつかのパーティションに分割できます。自動パーティション管理を使用して、テーブルを大きなサイズに簡単に拡張できます。この機能では、パーティションの作成と削除の競合の少ないロックなど、PGDの機能を使用します。

新しいパーティションを定期的に作成し、データ保持期間が終了したときに削除できます。

PGD管理は、主にSQLで呼び出すことができる関数によって達成されます。 PGDのすべての関数は、 bdr スキーマで公開されています。 search_pathに入れない限り、各関数の名前をスキーマ修飾する必要があります。

パーティションの自動作成

bdr.autopartition() は、表の自動レンジパーティション化の定義を作成または変更します。定義が存在しない場合は、作成されます。そうしないと、後の実行で定義が変更されます。

bdr.autopartition() は実際のテーブルをロックしません。新しいパーティションのメンテナンスアクションをいつ、どのように行うかの定義を変更します。

bdr.autopartition() は、テーブルの残りの部分をロックせずにパーティションをアタッチまたはデタッチ/ドロップできる機能を活用します(基になるPostgresバージョンがサポートしている場合)。

テーブルがRANGEパーティション分割されていない場合、またはマルチカラムパーティションキーが使用されている場合、ERRORが発生します。

デフォルトでは、AutoPartitionはパーティションをグローバルに管理します。言い換えれば、1つのノードでパーティションが作成されると、クラスター内の他のすべてのノードに同じパーティションが作成されます。デフォルトを使用すると、すべてのパーティションに一貫性があり、使用できることが保証されます。この機能のために、AutoPartitionはRaftを利用します。

managed_locally をtrue に設定することで、この動作を変更できます。その場合、すべてのパーティションは各ノードでローカルに管理されます。パーティションをローカルで管理することは、パーティションテーブルがレプリケートテーブルでない場合に役立ちます。たとえば、組み込みの bdr.conflict_history テーブルはレプリケートテーブルではありません。 AutoPartitionによってローカルに管理されています。各ノードはこのテーブルのパーティションをローカルに作成し、十分に古くなると削除します。

次の点も考慮してください。

  • managed_locally としてマークされたテーブルをグローバルに管理するように後で変更することはできません。その逆も同様です。

  • アクティビティは、エントリがenabled = on とマークされている場合にのみ実行されます。

  • 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が返されます。

AutoPartitioningの有効化または無効化

bdr.autopartition_enable() を使用して、指定されたテーブルでAutoPartitioningを有効にします。

AutoPartitioningがすでに有効になっている場合、アクションは発生しません。同様に、

bdr.autopartition_disable()

を使用して、指定されたテーブルのAutoPartitioningを無効にします。