パーティションテーブルには通常、膨大な量のデータが格納されています。クエリを高速化するために、通常はインデックスが使用されます。このトピックでは、パーティションテーブルのインデックスについて説明します。
インデックスタイプ
PolarDB for PostgreSQL (Oracle 互換) のパーティションテーブルは、2 つのインデックスタイプをサポートしています。
ローカルインデックス
パーティションテーブルでは、ローカルインデックスはパーティションに対応し、パーティションと同じ数と範囲を持ちます。インデックス付きの各パーティションは、親テーブルのパーティションに関連付けられています。したがって、インデックス付きパーティション内のすべてのキーは、単一のパーティションに格納されている行のみを参照します。そのため、インデックス付きパーティションは関連付けられたパーティションと自動的に同期され、互いに独立しています。
LOCAL 属性を指定することで、ローカルインデックスを作成できます。ローカルインデックスの場合、親テーブルと同じ数のパーティションまたはサブパーティションが作成されます。これらのパーティションまたはサブパーティションは、親テーブルと同じ範囲をカバーします。
PolarDB for PostgreSQL (Oracle 互換) は、親テーブルのパーティションが追加、削除、マージ、または分割された場合、あるいはハッシュパーティションまたはハッシュサブパーティションが追加またはマージされた場合に、インデックス付きパーティションを自動的に維持します。
パーティションキー列がインデックスキー列のサブセットである場合、一意のローカルインデックスを作成して、同じインデックスキーを持つ行が常に同じパーティションにマッピングされるようにすることができます。
グローバルインデックス
グローバルインデックスは B ツリーインデックスであり、親テーブルとは独立してパーティション化することもできます。
グローバルにインデックス付けされたパーティションは、親テーブルのすべてのパーティションを指すことができます。
グローバルインデックスを持つことができるのは、パーティションテーブルのみです。詳細については、「グローバルインデックス」をご参照ください。
構文
ローカルインデックスを作成する
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ INCLUDE ( column_name [, ...] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ TABLESPACE tablespace_name ]
[ WHERE predicate ]グローバルインデックスを作成する
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) GLOBAL
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ TABLESPACE tablespace_name ]PolarDB for PostgreSQL (Oracle 互換) 2.0 では、CONCURRENTLY パラメーターを指定して、インデックスを同時に作成できます。
例
ローカルインデックスを作成する
films テーブルの title 列に title_idx という名前のローカルインデックスを作成します。
CREATE UNIQUE INDEX title_idx ON films (title);グローバルインデックスを作成する
films テーブルの title 列に title_idx という名前のグローバルインデックスを作成します。
CREATE UNIQUE INDEX title_idx ON films (title) global;