OceanBaseデータベースは、ローカルインデックスとグローバルインデックスをサポートしています。本記事では、主にローカルインデックスとグローバルインデックスの概念、およびインデックス作成時のデフォルト動作について説明します。
ローカルインデックス
パーティションテーブルのローカルインデックスは、非パーティションテーブルのインデックスと同様であり、インデックスのデータ構造は依然としてメインテーブルのデータ構造と一対一の関係を保ちます。ただし、メインテーブルは既にパーティション化されているため、メインテーブルの各パーティションには独自のインデックスデータ構造が存在します。各インデックスデータ構造において、内部のキー(Key)は自身のパーティション内のメインテーブルデータにのみマッピングされ、他のパーティションのメインテーブルデータにはマッピングされません。このため、このようなインデックスはローカルインデックスと呼ばれます。
別の観点から見ると、このモードではインデックスのデータ構造もパーティション処理が施されているため、時にはローカルパーティションインデックス(Local Partitioned Index)とも呼ばれます。ローカルインデックスの構造は以下の図のとおりです。

上の図では、employee テーブルは emp_id に基づいてRangeパーティションに分割されており、同時に emp_name にローカルインデックスが作成されています。
グローバルインデックス
パーティションテーブルのローカルインデックスと比較して、パーティションテーブルのグローバルインデックスは、主表のパーティションと一対一の関係を保たなくなります。代わりに、すべての主表パーティションのデータを一つの全体として捉え、インデックス内のあるキーが複数の主表パーティションのデータにマッピングされる可能性があります(インデックスキーに重複値が存在する場合)。さらに進んで、グローバルインデックスは独自のデータ分布パターンを定義でき、非パーティションモードまたはパーティションモードを選択できます。パーティションモードでは、パーティションの分割方法は主表と同じでも異なっても構いません。
したがって、グローバルインデックスは以下の2種類に分類されます:
グローバル非パーティションインデックス(Global Non-Partitioned Index)
インデックスデータはパーティション化せず、単一のデータ構造を維持し、非パーティションテーブルのインデックスと類似します。しかし、主表は既にパーティション化されているため、インデックス内の特定のキーが異なる主表パーティションにマッピングされる、つまり一対多の対応関係が発生します。グローバル非パーティションインデックスの構造は以下の図のようになります。

グローバルパーティションインデックス(Global Partitioned Index)
インデックスデータは指定された方法でパーティション処理を行い、例えばハッシュ(Hash)パーティションや範囲(Range)パーティションを作成し、インデックスデータを異なるパーティションに分散します。しかし、インデックスのパーティションモードは完全に独立しており、主表のパーティションとは一切関係ありません。そのため、各インデックスパーティション内の特定のキーが異なる主表パーティションにマッピングされる可能性があります(インデックスキーに重複値が存在する場合)。インデックスパーティションと主表パーティションの間には多対多の対応関係があります。グローバルパーティションインデックスの構造は以下の図のようになります。

上の図では、
employeeテーブルはemp_idに基づいて Range パーティション化されており、同時にemp_nameに対してグローバルパーティションインデックスが作成されています。同一のインデックスパーティション内のキーが異なる主表パーティションを指し示すことができます。
グローバルインデックスのパーティションモードは主表のパーティションモードと全く関係がないため、グローバルインデックスは別の独立したテーブルのように見えます。そのため、グローバルインデックスを「インデックステーブル」と呼ぶこともあり、理解しやすくなります(主表と対応する)。
説明
非パーティションテーブルにもグローバルパーティションインデックスを作成できます。しかし、主表にパーティション化の必要がない場合、一般的にインデックスをパーティション化する必要もありません。
グローバルインデックスの使用を推奨するシナリオは以下のとおりです:
業務上、主キー以外にもグローバル一意性を強く要求する列の組み合わせがあり、この業務要件はグローバルな一意インデックスによってのみ実現できる場合。
業務のクエリでパーティションキーの条件述語を取得できず、かつ業務テーブルに高並行性の同時書き込みがない場合。全パーティションのスキャンを避けるために、クエリ条件に基づいてグローバルインデックスを構築し、必要に応じて新しいパーティションキーでグローバルインデックスをパーティション化できます。
注意点として、グローバルインデックスはグローバル一意性とデータの再パーティション化を可能にし、異なる次元でのクエリを必要とする業務要件を解決する一方で、その代償として、すべてのデータ書き込みがマシンを跨ぐ分散トランザクションになる可能性があります。高並行性の書き込みシナリオでは、システムの書き込み性能に影響を与えます。業務のクエリでパーティションキーの条件述語を利用できる場合、OceanBaseデータベースは依然としてローカルインデックスの構築を推奨します。これにより、データベースオプティマイザーのパーティションプルーニング機能を通じて、条件に合致しないパーティションを除外できます。この方法は、クエリと書き込みの両方の性能を同時に考慮でき、システム全体の性能を向上させることができます。
インデックス作成時のデフォルト動作
ユーザーがインデックスを作成する際に LOCAL または GLOBAL キーワードを指定しない場合、パーティションテーブルにはデフォルトでグローバルインデックス(GLOBAL)が作成されます。