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

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

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

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