パーティショニング戦略
OceanBaseデータベースは、データをパーティションに配置する方法を制御するためのさまざまなパーティショニング戦略を提供しています。
OceanBaseデータベースの基本的なパーティショニング戦略には、範囲 (Range) パーティション、リスト (List) パーティション、ハッシュ (Hash) パーティションが含まれます。
1次パーティションでは、1種類のデータ配分方法のみを使用できます。例えば、List パーティションのみを使用するか、Range パーティションのみを使用します。
サブパーティションを作成する場合、テーブルはまず1つのデータ配分方法でパーティション化され、その後、2番目のデータ配分方法を使用して各パーティションをさらにサブパーティションに分割します。例えば、テーブルに create_time 列と user_id 列が含まれている場合、create_time 列でRangeパーティションを使用し、user_id 列でHashを使用してサブパーティションを作成できます。
Range パーティション
Range パーティションは最も一般的なパーティションタイプであり、通常は日付と共に使用されます。Range パーティションを行う際、データベースはパーティションキーの値の範囲に基づいて行をパーティションにマッピングします。
各 Range パーティションには VALUES LESS THAN 句が含まれており、この句はパーティションの非包含的上限を指定します。このテキスト以上の値を持つパーティションキーは、次のより高いパーティションに追加されます。最初のパーティションを除き、すべてのパーティションには、前のパーティションの VALUES LESS THAN 句によって指定された暗黙の下限があります。
Range パーティションでは、最後のパーティションに MAXVALUE を定義できます。MAXVALUE は仮想的な無限大の値を表し、空値を含むパーティションキーの他のすべての可能な値よりも高い順位を持ちます。
Interval パーティション
Interval パーティションは Range パーティションの拡張であり、新規挿入されたデータが既存のパーティションの範囲を超える場合、新しいパーティションが自動的に作成されることを許可します。
Hash パーティション
Hash パーティションを行う際、データベースはユーザーが指定したパーティションキーに適用されるハッシュアルゴリズムに基づいて行をパーティションにマッピングします。行のターゲットパーティションは、内部のハッシュ関数によって計算されたハッシュ値と、Hash パーティションの数によって決定されます。パーティション数が2のべき乗の場合、ハッシュアルゴリズムはすべてのパーティションにおいてほぼ均等な行の分布を作成します。Hash アルゴリズムはパーティション間で均等に行を分散させるため、パーティションのサイズはほぼ同じになります。
Hash パーティションは、ノード間でデータを均等に分散させる理想的な方法です。また、特にパーティション化するデータが履歴データではない場合や、明確なパーティションキーがない場合には、Range パーティションの使いやすい代替方法でもあります。
Hash パーティションは、更新競合が非常に高い OLTP システムで非常に有用です。これは、Hash パーティションがテーブルを複数のパーティションに分割し、テーブル全体を変更する代わりに、異なるパーティションへの変更に分割するためです。
List パーティション
List パーティションを行う際、データベースは離散値のリストを各パーティションのパーティションキーとして使用します。パーティションキーは1つまたは複数の列で構成されます。
List パーティションを使用して、個々の行が指定されたパーティションにマッピングされる方法を制御できます。
パーティションキーに基づいてソートすることが不便な場合、List パーティションを使用してデータをグループ化および管理できます。
組み合わせパーティション
RANGEパーティション、LISTパーティション、HASHパーティションは、すべて複合パーティションテーブルのサブパーティション戦略として使用できます。
複合パーティションを作成する際、テーブルはあるデータ配分方法でパーティション化され、その後別のデータ配分方法を用いて各パーティションがさらにサブパーティションに細分化されます。したがって、複合パーティションは基本的なデータ配分方法を組み合わせたものです。指定されたパーティションのすべてのサブパーティションは、データの論理的なサブセットを表します。
複合パーティションには以下の利点があります:
SQLステートメントに基づいて、一次元または二次元でパーティションプルーニングを行うことで、パフォーマンスが向上する可能性があります。
クエリでは、任意の次元で全パーティションまたは部分的なパーティションを結合できます。
単一のテーブルに対して並列バックアップと復元を実行できます。
パーティション数が単層パーティションより多いため、並列実行に有利となる可能性があります。
ローリングウィンドウを実装して履歴データをサポートできます。多くのステートメントがパーティションプルーニングやパーティション結合から恩恵を受ける場合でも、別の次元でパーティショニングを続けることができます。
パーティションキーの特性に応じて、データを異なる方法で格納できます。例えば、特定の製品タイプのデータを読み取り専用の圧縮形式で保存し、他の製品タイプのデータは非圧縮のままにするという選択肢もあります。
以下の図は、RANGE-HASHとRANGE-LISTの複合パーティションを示しています。