AutoPartition

AutoPartitionを使用すると、自動パーティショニング管理によってテーブルを簡単にラージサイズに増やすことができます。これは、パーティションの作成と削除の競合の少ないロックなどのBDRの追加機能を利用します。

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

BDR管理は、主にSQL呼び出し可能な関数を介して実行されます。 BDRのすべての関数は bdr スキーマで公開されています。 search_path に入れない限り、各ファンクションの名前をスキーマ修飾する必要があります。

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

bdr.autopartition() は、表の自動レンジパーティショニングの定義を作成または変更するために使用されます。定義が存在しない場合は作成され、それ以外の場合は後の実行で定義が変更されます。

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

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

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

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 パラメータは、タイムスタンプ(および関連する)ベースのパーティションでのみサポートされています。期間はパーティションの上限を考慮して計算され、パーティションは二次的なテーブルスペースに移行されるか、上限に対して指定された期間が経過すると削除されます。

デフォルトでは、AutoPartitionはパーティションをグローバルに管理します。言い換えれば、1つのノードでパーティションが作成されると、クラスター内の他のすべてのノードにも同じパーティションが作成されます。したがって、すべてのパーティションは一貫しており、使用できることが保証されています。このために、AutoPartitionはRaftを利用します。この動作は、 managed_locally をtrue として渡すことで変更できます。その場合、すべてのパーティションは各ノードでローカルに管理されます。これは、パーティションテーブルがレプリケートテーブルではないため、すべてのノードにすべてのパーティションを持つ必要がない場合、または望ましくない場合に役立ちます。例、ビルトインのbdr.conflict_history テーブルはレプリケートテーブルではなく、ローカルのAutoPartitionによって管理されます。各ノードはこのテーブルのパーティションをローカルに作成し、十分に古くなると削除します。

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

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

ユーザは、AutoPartitionによって管理されるテーブルのパーティションを手動で作成または削除する必要はありません。これをmakeと、AutoPartitionメタデータに一貫性がなくなり、失敗する可能性があります。

自動パーティションを構成する

bdr.autopartition ファンクションは、テーブルの自動パーティションを構成します。

概要

bdr.autopartition(relation regclass,
        partition_increment text,
        partition_initial_lowerbound text DEFAULT NULL,
        partition_autocreate_expression text DEFAULT NULL,
        minimum_advance_partitions integer DEFAULT 2,
        maximum_advance_partitions integer DEFAULT 5,
        data_retention_period interval DEFAULT NULL,
        managed_locally boolean DEFAULT false,
        enabled boolean DEFAULT on);

パラメーター

  • relation - テーブルの名前またはOID。

  • partition_increment - 次のパーティション作成までのインターバルまたはインクリメント。

  • partition_initial_lowerbound - テーブルにパーティションがない場合、この下限とpartition_increment 離れた上限を持つ最初のパーティションが作成されます。

  • partition_autocreate_expression - 新しいパーティションを作成するかどうかを検出するために使用されます。

  • minimum_advance_partitions -システムは常に少なくともminimum_advance_partitions パーティションを持とうとします。

  • maximum_advance_partitions - 事前パーティションの数がminimum_advance_partitions を下回ると、一度に作成されるパーティションの数。

  • data_retention_period - 古いパーティションが削除されるまでのインターバル(定義されている場合)。これは migrate_after_period より大きいなければなりません。

  • managed_locally - trueの場合、パーティションはローカルで管理されます。

  • enabled -アクティビティを無効/一時停止し、後で再開/再度有効にします。

例

日単位のパーティション、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
     );

1つのAutoPartitionを作成する

bdr.autopartition_create_partition() を使用して、親テーブルにスタンドアロンのAutoPartitionを作成します。

概要

bdr.autopartition_create_partition(relname regclass,
                               partname name,
                                   lowerb text,
                                   upperb text,
                                   nodes oid[]);

パラメーター

  • relname - アタッチする親テーブルの名前またはOID

  • partname - 新しいAutoPartitionの名前

  • lowerb -パーティションの下限

  • upperb -パーティションの上限

  • nodes - 新しいパーティションが存在するノードのリスト

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

bdr.drop_autopartition() を使用して、指定されたリレーションの自動パーティションルールを削除します。リレーションの保留中の作業項目はすべて削除され、新しい作業項目は作成されません。

bdr.drop_autopartition(relation regclass);

パラメーター

  • relation -テーブルの名前またはOID

AutoPartitionを1つ削除する

このファンクションは削除する単一のパーティションを指定できるため、 BDR AutoPartitionテーブルが作成されたら bdr.autopartition_drop_partition を使用します。パーティションテーブルが正常に削除された場合、このファンクションはtrueを結果ます。

概要

bdr.autopartition_drop_partition(relname regclass)

パラメーター

  • relname - 削除するパーティションテーブルの名前

ノート

これにより、選択したパーティションテーブルで DROP TABLE を使用する前に、親テーブルにDDLロックが設定されます。

パーティションの作成を待つ

bdr.autopartition_wait_for_partitions() を使用して、ローカルノードでパーティションが作成されるのを待ちます。このファンクションは、パーティションテーブル名前とパーティションキー列の値を受け取り、その値を保持するパーティションが作成されるまで待機します。

このファンクションは、パーティションがローカルに作成されるのを待機するだけです。パーティションがリモートノードにも存在することは保証しません。

すべてのBDRノードにパーティションが作成されるのを待つには、 オーダーファンクションを使用します。このファンクションは、ローカルとすべてのリモートノードを内部的にチェックし、パーティションがどこにでも作成されるまで待機します。

概要

bdr.autopartition_wait_for_partitions(relation regclass, text bound);

パラメーター

  • relation -テーブルの名前またはOID

  • bound -パーティションキー列の値。

概要

bdr.autopartition_wait_for_partitions_on_all_nodes(relation regclass, text bound);

パラメーター

  • relation - テーブルの名前またはOID。

  • bound -パーティションキー列の値。

パーティションを見つける

bdr.autopartition_find_partition() ファンクションを使用して、指定されたパーティションキー値のパーティションを見つけます。その値を保持するパーティションが存在しない場合、ファンクションはNULLを戻します。それ以外の場合は、パーティションのOIDが返されます。

概要

bdr.autopartition_find_partition(relname regclass, searchkey text);

パラメーター

  • relname - パーティションテーブルの名前。

  • searchkey -検索するパーティションキー値。

自動パーティショニングを有効/無効にする

bdr.autopartition_enable() を使用して、指定されたテーブルでAutoPartitioningを有効にします。自動パーティショニングが既に有効になっている場合、何もしません。同様に、 bdr.autopartition_disable() を使用して、指定されたテーブルでAutoPartitioningを無効にします。

概要

bdr.autopartition_enable(relname regclass);

パラメーター

  • relname - AutoPartitioningを有効にするリレーションの名前。

概要

bdr.autopartition_disable(relname regclass);

パラメーター

  • relname - AutoPartitioningを無効にするリレーションの名前。

概要

bdr.autopartition_get_last_completed_workitem();

クラスター内のすべてのノードで正常に完了した最後の作業項目の id を返します。

AutoPartitionワーカーを確認する

bdr.autopartition_work_queue_check_status ファンクションを使用すると、AutoPartitionsを維持するためにジョブをしているバックグラウンドワーカーのステータスを確認できます。

ワーカーは次のビューで見ることができます。autopartition_work_queue_local_status autopartition_work_queue_global_status

概要

bdr.autopartition_work_queue_check_status(workid bigint
                           local boolean DEFAULT false);

パラメーター

  • workid - AutoPartitionワーカーのキー

  • local -ローカルのステータスのみを確認する

注意事項

AutoPartitionワーカーは、 bdr.autopartitionファンクションが初めて呼び出される前でも、常にバックグラウンドで実行されています。無効なワーカーIDが使用された場合、ファンクションは「unknown」を結果ます。 「進行中」は一般的なステータスです。