このセクションでは、OceanBaseデータベースのパーティションとその種類について説明します。
パーティションの紹介
OceanBaseデータベースでは、通常のテーブルのデータを一定のルールに従って複数のブロックに分割し、同一ブロック内のデータを物理的にまとめて保存することができます。このようにブロックに分割されたテーブルをパーティションテーブルと呼び、その各ブロックをパーティションと呼びます。OceanBaseデータベースのOracleモードでは、単一のテーブルでサポートされる最大パーティション数は65,536個です。
以下の図のように、あるテーブルが5つのパーティションに分割され、2台のマシンに分散して配置されています:

上記のパーティションテーブルの各パーティションは、さらに一定のルールに従って複数のパーティションに分割することができます。このようなパーティションテーブルをサブパーティションテーブルと呼びます。
パーティションキー
パーティションキーとは、データ行が属するパーティションを決定するために使用される列の集合を指します。OceanBaseデータベースのOracleモードでは、その定義は以下のルールに従う必要があります:
- テーブルに主キーが存在する場合、パーティションキーは主キーの部分集合でなければなりません。
- テーブルに主キーがない場合、パーティションキーは任意の列の組み合わせであり、主キーの制限を受けません。
パーティション式
パーティション式とは、パーティションキーに基づいて構築された計算ロジックであり、データ行を特定のパーティションにマッピングするために使用されます。
パーティションの種類
OceanBaseデータベースのOracleモードで現在サポートされているパーティションタイプは以下のとおりです:
Rangeパーティション
- Intervalパーティション
Listパーティション
Hashパーティション
組み合わせパーティション
Rangeパーティション
Rangeパーティションは、パーティションテーブル定義時に各パーティションに設定したパーティションキー値の範囲に基づき、データを対応するパーティションにマッピングします。これは一般的なパーティションタイプであり、日付型と併用されることが多いです。例えば、業務ログテーブルを日/週/月単位でパーティション分割できます。
Rangeパーティションのパーティションキーは1つまたは複数の列で構成され、パーティションキーは列名でなければならず、式は使用できません。数値型、文字列型、時間型(TIMESTAMP WITH TIME ZONE型とTIMESTAMP WITH LOCAL TIME ZONE型を除く)、Interval型、RAW型などをサポートしていますが、BLOB型とCLOB型はサポートしていません。
Intervalパーティション
IntervalパーティションはRangeパーティションの拡張機能であり、新規挿入されたデータが既存のパーティションの範囲を超える場合、新しいパーティションの自動作成を許可します。
Intervalパーティションの制限事項は以下のとおりです:
Intervalパーティションはテーブルのパーティションにのみ使用でき、サブパーティションとしては使用できません。サブパーティションテーブルでは、パーティションをIntervalパーティションに、サブパーティションを他のパーティションタイプにすることは可能です。
Intervalパーティションキーの型は、
NUMBER、DATE、FLOAT、TIMESTAMPのみをサポートします。注意
NUMBER型は精度の指定をサポートしていません。UPDATEによる自動パーティション追加時には、ALTER TABLE table_name ENABLE ROW MOVEMENT;を設定する必要があります(パーティションキーの更新のために異なるパーティション間での移動を許可するため)。自動追加されたパーティションは、一度作成されるとトランザクションのロールバックには対応しません。
Intervalパーティションを持つテーブルは、パーティションのスプリットやパーティションの交換をサポートしていません。
INSERTステートメントによる自動パーティション追加と同時に、別のDDLステートメントを実行すると、ロック競合が検出されエラーが発生する可能性があります。Intervalパーティションテーブルの最大パーティション数は1048575です。
テーブル作成時に定義されたInterval間隔の変更は、現在サポートされていません。
Listパーティション
Listパーティションでは、レコード行がパーティションにマッピングされる方法を明示的に制御できます。具体的には、各パーティションのパーティションキーに対して一連の離散値リストを指定します。これはRangeパーティションやHashパーティションとは異なります。Listパーティションの利点は、無秩序または関連性のないデータセットを容易にパーティション分割できることです。
Listパーティションのパーティションキーは1つまたは複数の列で構成され、パーティションキーは列名でなければならず、式は使用できません。数値型、文字列型、時間型(TIMESTAMP WITH TIME ZONE型とTIMESTAMP WITH LOCAL TIME ZONE型を除く)、Interval型、RAW型などをサポートしていますが、BLOB型とCLOB型はサポートしていません。
Hashパーティション
Hashパーティションは、RangeパーティションやListパーティションの方法で分割できないシナリオに適しています。その実装方法はシンプルで、パーティションキーに対するHash関数の値に基づいてレコードを異なるパーティションにハッシュします。データが以下の特徴に合致する場合、Hashパーティションの使用は優れた選択です:
データのパーティションキーのリスト特性を指定できない場合。
異なる範囲のデータサイズに大きな差があり、手動での均等化調整が困難な場合。
Rangeパーティションを使用した後にデータの偏りが深刻な場合。
パラレルDML、パーティションプルーニング、パーティション結合などのパフォーマンスが非常に重要な場合。
Hashパーティションのパーティションキーは1つまたは複数の列で構成され、パーティションキーは列名でなければならず、式は使用できません。数値型、文字列型、時間型(TIMESTAMP WITH TIME ZONE型とTIMESTAMP WITH LOCAL TIME ZONE型を除く)、Interval型、RAW型などをサポートしていますが、BLOB型とCLOB型はサポートしていません。
組み合わせパーティション
組み合わせパーティションは通常、まず1つのパーティション戦略を使用し、その後サブパーティションで別のパーティション戦略を使用するもので、業務テーブルのデータ量が非常に大きい場合に適しています。組み合わせパーティションを使用することで、さまざまなパーティション戦略の利点を活かすことができます。
パーティション名のルール
ListパーティションとRangeパーティションの場合、テーブル作成時にパーティション名が指定されるため、名前はその時に指定された名前となります。
Hashパーティションの場合、作成時にパーティション名が指定されていない場合、システムが命名ルールに基づいて名前を付けます。具体的には、各パーティションがそれぞれp0、p1、...、pnという名前になります。
テンプレート化されたサブパーティションテーブルの場合、サブパーティションの命名ルールは($part_name)s($subpart_name)です。テンプレート化されていないサブパーティションテーブルの場合、サブパーティションの名前は定義済みのパーティション名となります。