この記事では、OceanBaseデータベースのパーティションとその種類について説明します。
パーティションの紹介
OceanBaseデータベースでは、通常のテーブルのデータを一定のルールに基づいて異なるブロックに分割し、同一ブロック内のデータを物理的にまとめて格納することができます。このようにブロックに分割されたテーブルをパーティションテーブルと呼び、その各ブロックをパーティションと呼びます。OceanBaseデータベースのOracleモードでは、単一のテーブルで最大65,536個のパーティションを作成できます。
以下の図に示すように、テーブルは5つのパーティションに分割され、2台のマシンに分散しています:

上記のパーティションテーブルの各パーティションは、さらに一定のルールに基づいて複数のパーティションに細分化することも可能です。このようなパーティションテーブルをサブパーティションテーブルと呼びます。
説明
OBShardingツールとサブパーティションテーブルを組み合わせることで、5レベルのテーブルパーティショニング機能を実現できます。
パーティションキー
パーティションキーとは、データ行が属するパーティションを決定するための列の集合を指します。OceanBaseデータベースのOracleモードでは、その定義に以下のルールに従う必要があります:
- テーブルに主キーが存在する場合、パーティションキーは主キーの部分集合でなければなりません。
- テーブルに主キーがない場合、パーティションキーは任意の列の組み合わせとなり、主キーの制限を受けません。
パーティション式
パーティション式とは、パーティションキーに基づいて構築される計算ロジックであり、データ行を具体的なパーティションにマッピングするために使用されます。
パーティションの種類
OceanBaseデータベースのOracleモードで現在サポートされているパーティションタイプは以下の通りです:
Rangeパーティション
Listパーティション
Hashパーティション
コンポジット・パーティション
Rangeパーティション
Rangeパーティションは、パーティションテーブルの定義時に各パーティションに設定されたパーティションキー値の範囲に基づいて、データを対応するパーティションにマッピングします。これは一般的なパーティションタイプであり、日付型と併用されることが多いです。例えば、業務ログテーブルを日/週/月ごとにパーティション分割することができます。
Rangeパーティションのパーティションキーは1列または複数の列で構成され、パーティションキーは列名でなければならず、式を使用することはできません。数値型、文字列型、日付型(TIMESTAMP WITH TIME ZONE型およびTIMESTAMP WITH LOCAL TIME ZONE型を除く)、Interval型、RAW型などがサポートされており、BLOB型とCLOB型はサポートされていません。
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)となります。テンプレート化されていないサブパーティションテーブルの場合、サブパーティションの名前はユーザー定義のパーティション名となります。