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