パーティショニング戦略
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パーティションのパーティションキーは整数型またはYEAR型でなければなりません。他のデータ型の日付フィールドをパーティション化する場合は、関数を使用して変換する必要があります。Rangeパーティションのパーティションキーは1列のみをサポートします。
複数列のパーティションキー、または他のデータ型をサポートするには、Range Columnsパーティションを使用できます。
Range Columnsパーティションの機能はRangeパーティションと基本的に同じですが、以下の点が異なります:
Range Columnsパーティションのパーティションキーはデータ型をサポートしており、具体的なタイプは以下のとおりです:
- 数値型:
TINYINT(BOOL/BOOLEAN)、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT、DECIMAL(DECIMAL/DECIMAL[(M[,D])]/DEC/NUMERIC/FIXED)、FLOAT(FLOAT[(M,D)]/FLOAT(p))、DOUBLE(DOUBLE/DOUBLE[(M,D)]/DOUBLE PRECISION/REAL)。 - 日付時刻型:
DATE、DATETIME、TIME、YEAR、TIMESTAMP。 - 文字列型:
CHAR、NCHAR、VARCHAR、NVARCHAR。 - バイナリ型:
BINARY、VARBINARY。
- 数値型:
Range Columnsパーティション列では、複数の列(つまり列ベクトル)を指定できます。
Range Columnsパーティション列は整数型である必要はなく、任意のタイプを指定できます。
Range Columnsパーティション定義は式をサポートしません。
HashパーティションとKeyパーティション
Hashパーティション
Hashパーティションを行う際、データベースはユーザーが指定したパーティションキーに適用されるハッシュアルゴリズムに基づいて行をパーティションにマッピングします。
行のターゲットパーティションは、内部ハッシュ関数によって計算されるハッシュ値によって決定され、その後、ハッシュパーティションの数に基づいて決定されます。パーティション数が2のべき乗の場合、ハッシュアルゴリズムはすべてのパーティション間でほぼ均等な行の分散を作成します。
ハッシュアルゴリズムはパーティション間で行を均等に分散し、パーティションのサイズをほぼ同一にします。
Hashパーティションは、ノード間でデータを均等に分散する理想的な方法です。Hashパーティションは、特にパーティション化するデータが履歴データではない場合や明確なパーティションキーがない場合に、Rangeパーティションの使いやすい代替方法でもあります。
Hashパーティションは、更新競合が非常に高いOLTPシステムで非常に有用です。これは、Hashパーティションがテーブルをいくつかのパーティションに分割し、テーブル全体を変更する代わりに、テーブルの変更を異なるパーティションに分散するためです。
Hashパーティションキーの式はINT型を返す必要があります。
Keyパーティション
KeyパーティションはHashパーティションと似ています。主な違いは以下のとおりです:
Hashパーティションのパーティションキーはユーザー定義の式にすることができますが、Keyパーティションのパーティションキーは列に限定され、または指定されない場合もあります。
keyパーティションのパーティションキーは
INT型に限られません。
keyパーティションでは、列を指定するかどうか、または複数の列をパーティションキーとして指定することができます。テーブルに主キーがある場合、これらの列はテーブルの主キーの一部または全部でなければなりません。Keyパーティションでパーティションキーを指定しない場合、パーティションキーは主キー列になります。主キーがなくUNIQUEキーがある場合、パーティションキーはUNIQUEキーになります。
リストパーティション
リストパーティションを行う際、データベースは各パーティションのパーティションキーとして離散値リストを使用します。パーティションキーは1つまたは複数の列で構成されます。
リストパーティションを使用することで、単一の行が指定されたパーティションにどのようにマッピングされるかを制御できます。パーティションキーに基づいてソートすることが困難な場合、リストパーティションを使用してデータをグループ化および管理できます。
リストパーティションは単一のパーティションキーのみをサポートし、パーティションキーは1列または1つの式にすることができます。パーティションキーのデータ型はINTタイプのみをサポートします。
複数列のリストパーティションや他のデータ型のリストパーティションを使用する場合は、List Columnsパーティションを使用できます。
List Columnsパーティションはリストパーティションの拡張機能であり、複数のパーティションキーをサポートし、INTデータ、DATEタイプ、DATETIMEタイプをサポートします。
コンポジット・パーティション
範囲(Range)パーティション、リスト(List)パーティション、ハッシュ(Hash)パーティションは、コンポジット・パーティションテーブルのサブパーティション戦略として使用できます。
コンポジット・パーティションを行う際、テーブルはある種類のデータ割り当て方法でパーティションを作成し、次に別のデータ割り当て方法を使用して各パーティションをさらに細分化します。したがって、コンポジット・パーティションは基本的なデータ配布方法を組み合わせています。指定されたパーティションのすべてのサブパーティションは、データの論理的なサブセットを表します。
コンポジット・パーティションには以下の利点があります:
SQLステートメントに基づいて、1次元または2次元でパーティションクリップを行うことでパフォーマンスが向上する可能性があります。
クエリでは、任意の次元でフルパーティションまたは部分的なパーティション結合を使用できます。
単一のテーブルに対して並列バックアップと復旧を実行できます。
パーティションの数は単層パーティションよりも多く、これはパラレル実行に有利になる可能性があります。
ローリングウィンドウを実装して履歴データをサポートできます。多くのステートメントがパーティションクリップまたはパーティション結合から恩恵を受ける場合でも、別の次元でパーティションを作成できます。
パーティションキーの識別に基づいて、データを異なる方法で保存できます。例えば、特定の製品タイプのデータを読み取り専用の圧縮形式で保存し、他の製品タイプのデータは圧縮しないことを選択できます。
次の図は、Range-HashとRange-Listのコンポジット・パーティションを示しています。
