パーティショニング戦略
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 パーティションを行う際、データベースはユーザーが指定したパーティションキーに適用されるハッシュアルゴリズムに基づいて行をパーティションにマッピングします。
行のターゲットパーティションは、内部のハッシュ関数によって計算されたハッシュ値と、Hash パーティションの数によって決定されます。パーティション数が2のべき乗の場合、ハッシュアルゴリズムはすべてのパーティションにおいてほぼ均等な行の分散を作成します。
ハッシュアルゴリズムは、パーティション間で行を均等に分散させ、各パーティションのサイズをほぼ同じにします。
ハッシュパーティションは、ノード間でデータを均等に分散させる理想的な方法です。また、特に対象となるデータが履歴データではない場合や、明確なパーティションキーが存在しない場合には、Rangeパーティションの使いやすい代替手段でもあります。
ハッシュパーティションは、更新競合が非常に高いOLTPシステムにおいて非常に有用です。これは、ハッシュパーティションがテーブルを複数のパーティションに分割し、テーブル全体を変更する代わりに、変更を異なるパーティションに分散して行うためです。
ハッシュパーティションキーの式は、INT 型を返す必要があります。
Keyパーティション
Keyパーティションはハッシュパーティションと類似しています。主な違いは以下の通りです:
ハッシュパーティションのパーティションキーはユーザー定義の式にできますが、Keyパーティションのパーティションキーは列のみ、または指定しないこともできます。
Keyパーティションのパーティションキーは
INT型に限定されません。
Keyパーティションでは、列を指定する場合も指定しない場合も、複数の列をパーティションキーとして指定することもできます。テーブルに主キーがある場合、これらの列はテーブルの主キーの一部または全部でなければなりません。Keyパーティションでパーティションキーを指定しない場合、パーティションキーは主キー列となります。主キーがなく UNIQUE キーがある場合、パーティションキーは UNIQUE キーとなります。
Listパーティション
Listパーティションを行う際、データベースは離散値のリストを各パーティションのパーティションキーとして使用します。パーティションキーは1つまたは複数の列で構成されます。
Listパーティションを使用すると、個々の行が指定されたパーティションにマッピングされる方法を制御できます。パーティションキーに基づいてソートすることが不便な場合、Listパーティションを使用してデータをグループ化および管理できます。
Listパーティションは単一のパーティションキーのみをサポートし、パーティションキーは1列または1つの式にすることができます。パーティションキーのデータ型は INT 型のみをサポートします。
複数列のListパーティションや、他のデータ型のListパーティションを使用したい場合は、List Columnsパーティションを使用できます。
List ColumnsパーティションはListパーティションの拡張機能であり、複数のパーティションキーをサポートし、INT 型、DATE 型、DATETIME 型をサポートします。
組み合わせパーティション
Rangeパーティション、Listパーティション、Hashパーティションは、組み合わせパーティションテーブルのサブパーティション戦略として使用できます。
組み合わせパーティションを行う際、テーブルはあるデータ配分方法でパーティション分けされ、その後、別のデータ配分方法を用いて各パーティションをさらにサブパーティションに細分化します。このように、組み合わせパーティションは基本的なデータ配分方法を組み合わせています。指定されたパーティションのすべてのサブパーティションは、データの論理的なサブセットを表します。
組み合わせパーティションには以下の利点があります:
SQL文に応じて、一次元または二次元でのパーティションプルーニングを行うことで、パフォーマンスを向上させる可能性があります。
クエリは、任意の次元で全パーティションまたは部分的なパーティションを結合することができます。
単一のテーブルに対して並列バックアップと復元を実行できます。
パーティションの数は単層パーティションよりも多く、並列実行に有利となる可能性があります。
ローリングウィンドウを実装して履歴データをサポートできます。多くのステートメントがパーティションプルーニングやパーティション結合から恩恵を受ける場合でも、別の次元でのパーティショニングを継続できます。
パーティションキーの特性に基づいて、データを異なる方法で格納できます。例えば、特定の製品タイプのデータを読み取り専用の圧縮形式で保存し、他の製品タイプのデータは非圧縮のままにすることを選択できます。
次の図は、Range-HashとRange-Listを組み合わせたパーティショニングを示しています。
