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がすでに有効になっている場合、アクションは発生しません。同様に、
を使用して、指定されたテーブルのAutoPartitioningを無効にします。