このセクションでは、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型はサポートされていません。
組み合わせパーティション
組み合わせパーティションは通常、最初にある種のパーティション戦略を使用し、その後サブパーティションで別のパーティション戦略を使用するもので、業務テーブルのデータ量が非常に大きい場合に適しています。組み合わせパーティションを使用することで、さまざまなパーティション戦略の利点を活かすことができます。
パーティション名のルール
LISTパーティションとRANGEパーティションの場合、テーブル作成時にパーティション名が指定されるため、その名前は作成時に指定したものになります。
HASHパーティションの場合、作成時にパーティション名を指定しなかった場合、システムが命名規則に基づいて名前を付けます。具体的には、各パーティションがそれぞれp0、p1、…、pnという名前になります。
テンプレート型のサブパーティションテーブルでは、サブパーティションの命名規則は($part_name)s($subpart_name)です。非テンプレート型のサブパーティションテーブルでは、サブパーティションの名前は定義した名前そのものになります。