パーティション化表の索引

以下のタイプの索引は、パーティション化表 (パーティション化索引、パーティション索引 (PI)、データ・パーティション化副次索引 (DPSI)、および非パーティション化副次索引 (NPI または NPSI)) のみに適用されます。

パーティション索引

パーティション化索引 とは、物理的にパーティション化された索引の一種です。 XML 索引を除くパーティション化表の索引は、すべて物理的にパーティション化できます。

パーティション化索引を作成するには、CREATE INDEX ステートメント内で PARTITIONED を指定します。

パーティション化索引は、複数データ・セットで構成されます。 それぞれのデータ・セットは、表パーティションに対応します。 次の図に、パーティション化索引と非パーティション化索引の相違点を示します。

図1: パーティション化索引と非パーティション化索引の比較
図の説明の開始 この図に、パーティション化索引と非パーティション化索引の相違点を示します。 図の説明の終わり。

パーティション索引

パーティション索引 は、表をパーティションで区切る 1 つ以上の列に対する索引です。 Db2テーブル制御パーティショニングを使用しており、パーティショニングスキーム(パーティショニングキーとリミットキーの値)はテーブル定義で既に定義されているため、パーティショニングインデックスは通常必要ありません。

CREATE INDEX ステートメントには、索引をパーティション索引として指定する特定の SQL キーワードはありません。 代わりに、CREATE INDEX ステートメントで指定された索引キーがパーティション・キーと一致すれば、索引はパーティション索引になります。 パーティション・キー は、CREATE TABLE ステートメントの PARTITION BY 文節で指定される 1 つ以上の列です。 これらの列は、表をパーティションで区切ります。 索引キーの左端の列と照合シーケンス (ASC/DESC) がパーティション・キーの列と同じである場合に、索引キーはパーティション・キーと一致します。

パーティション・キーは、限界キー値とは異なります。 パーティション・キーは、表をパーティションで区切る列を定義します。 限界キー値は、各パーティションに属する値を定義します。 具体的には、限界キー値 はパーティション境界を定義するパーティション・キーの値です。 この値は、昇順索引の場合はパーティション・キーの最大値、降順索引の場合は最小値です。 限界キー値が PARTITION に指定されています ... CREATE TABLE ステートメントまたは ALTER TABLE ステートメントの ENDING AT 文節。 指定された範囲により、表スペースと対応するパーティション索引スペースがパーティションで区切られます。

覚えておいてください: パーティショニングはクラスタリングとは異なります。 一方、 パーティショニングは、パーティショニングリミットキーで定義された値の範囲に基づいて行が特定のパーティションにグループ化されることを保証し、 クラスタリングは、パーティションまたはテーブルスペース内で行が物理的にどのように順序付けられるかを制御します。 クラスター化はクラスター化索引によって制御され、あらゆるタイプの表スペースに適用できます。 詳細は、「インデックスのクラスタリング 」を参照してください。

Db2 の以前のリリースで作成されたテーブルでは、 インデックス制御パーティショニングが使用されている場合があります。パーティショニングのスキームは、テーブル定義の一部として定義されていません。 この場合は、パーティション化スキームを指定するためにパーティション索引が必要です。 (パーティション・キーと限界キー値は、CREATE INDEX ステートメントの PART VALUES 文節で指定されていました。)

非推奨関数Db2 12 は、インデックス制御パーティショニングを使用する範囲パーティショニングテーブルとインデックスを処理できます。 しかし、このようなテーブルやインデックスは推奨されていません。 最良の結果を得るには、できるだけ早くテーブル制御パーティショニング(およびPBRテーブルスペース)を使用するように変換してください。 詳細については、「テーブルスペースをテーブル制御パーティショニングで使用するための変換」 を参照してください。

パーティション分割インデックスの例

汎用プログラミングインターフェース情報の開始。例えば、以下のCREATE TABLE文を発行して、州別の市外局番を含むAREA_CODESテーブルを作成したとします。

CREATE TABLE AREA_CODES
  (AREACODE_NO  INTEGER  NOT NULL,
   STATE        CHAR (2) NOT NULL)

   PARTITION BY RANGE (AREACODE_NO)
   (PARTITION 1 ENDING AT (299),
    PARTITION 2 ENDING AT (399),
    PARTITION 3 ENDING AT (499),
    PARTITION 4 ENDING AT (599),
    PARTITION 5 ENDING AT (699),
    PARTITION 6 ENDING AT (799),
    PARTITION 7 ENDING AT (899),
    PARTITION 8 ENDING AT (MAXVALUE));

オプションとして、以下のCREATE INDEX文を発行して、例として挙げたAREA_CODESテーブルにパーティショニングインデックスを作成することができます。 このインデックスは必要ありません。なぜなら、AREA_CODESテーブルのパーティショニングスキームはCREATE TABLE文で定義されており、AREA_CODESはテーブル制御パーティショニングを使用しているからです。

CREATE INDEX AREACODE_IX1 ON AREA_CODES (AREACODE_NO)
  CLUSTER PARTITIONED;
ヒント :クラスタリングにパーティショニング・インデックスを使用する場合、データ行はテーブル・スペース全体にわたって物理的に順序付けすることができます。
汎用プログラミングインターフェース情報の終了。

非パーティション索引 (副次索引)

パーティション索引でない索引は、非パーティション索引 または副次索引 です。 表に対して副次索引を作成して、ユニーク制約の適用、データのクラスター化、または照会用のデータに対するアクセス・パスの指定を行うことができます。

索引の有用性は、索引のキー内の列、およびキーのカーディナリティーによって決まります。 選択、結合、グループ化、または順序付けを頻繁に行う列をキーにすることをお勧めします。 さらに、大きなテーブルのインデックスキーの値の数は、 Db2 がインデックスを使用してデータを取得するために十分な数でなければなりません。 そうでない場合、 Db2 はテーブルスペーススキャンを行うかもしれません。

作成できる副次索引としては、パーティション化されたもの (データ・パーティション化副次索引と呼ばれる) と、パーティション化されていないもの (非パーティション化副次索引と呼ばれる) の 2 種類があります。

データ・パーティション化副次索引 (DPSI)
データ・パーティション化副次索引 (DPSI) は非パーティション索引であり、基礎となるデータのパーティション化スキームに従って物理的にパーティション化されます。

DPSI には、表スペース内のパーティションと同じ数のパーティションがあります。 各 DPSI パーティションには、対応する表スペース・パーティションの行のみのキーが格納されます。 例えば、表スペースに 3 つのパーティションがある場合、DPSI パーティション 1 内のキーは表スペース・パーティション 1 内の行のみを参照し、DPSI パーティション 2 内のキーは表スペース・パーティション 2 内の行のみを参照し、以降同様となります。

制約事項:
  • DPSI を作成できる対象は、パーティション化表スペース内の表のみです。
  • DPSI は、増加対応パーティション表スペースには作成できません。
  • XML 索引を DPSI にすることはできません。

DPSI を定義するには、CREATE INDEX ステートメントで PARTITIONED キーワードを使用し、パーティション・キー列と一致しない索引キーを指定します。 PARTITIONEDキーワードで指定したインデックスの最も左側の列がパーティショニングキーと一致する場合、 Db2 は、一致する列の照合順序が異なる場合にのみ、DPSIとしてインデックスを作成します。

DPSI を使用すると、パーティションの独立性が促進されるため、特に以下のようなパフォーマンス上の利点が得られます。

  • 表スペースの異なるパーティションをターゲットとする PART オプションを指定した、並列 LOAD ユーティリティー・ジョブ間の競合が解消される。
  • パーティションを追加したり、パーティションを最終パーティションへ循環させるなど、パーティション・レベルでの操作が容易になる。
  • パーティション化表スペースの副次索引のリカバリー時間が短縮される。

ただし、DPSI を使用しても、常に照会のパフォーマンスが向上するとは限りません。 例えば、DPSIのキーの列のみを参照する述語を持つクエリの場合、 Db2 は、述語を満たす値をインデックスの各パーティションでプローブする必要があります。

次の条件をすべて満たす照会では、DPSI にパフォーマンス上の利点があります。

  • 照会に、DPSI 列についての述部がある。
  • 照会には、表内のパーティションのサブセットに照会を制限する、表のパーティション列についての追加述部が含まれている。
非パーティション化副次索引 (NPI または NPSI)
非パーティショニングのセカンダリインデックス (NPIまたはNPSI)とは、パーティショニングインデックスとして定義されておらず、物理的にパーティショニングされていないインデックスを指します。 NPI 索引には、表スペースのすべてのパーティションの行のキーを含む索引スペースが 1 つあります。

NPI を作成できる対象は、パーティション化表スペース内の表です。 これらの索引は、非パーティション化表スペースには適用されません。

NPIは物理的に分割されていませんが、論理的なパーティションは存在します。 論理パーティションは、特定のテーブルスペースパーティションに対応するインデックスエントリーのサブセットです。

NPI には、次の条件を満たす照会では、パフォーマンス上の利点があります。

  • 照会には、表内のパーティションの小さなサブセットに照会を制限する、表のパーティション列についての述部は含まれていない。
  • 照会の制限は索引列に一致する。
  • SELECT リスト列が索引に組み込まれている (索引専用アクセスの場合)。

DPSIとNPIの利点の例

汎用プログラミングインターフェース情報の開始。
DPSIとNPIを使用する利点を理解するために、AREA_CODESテーブルの以下のインデックス例を考えてみましょう
STATE列のデータ分割セカンダリインデックス(DPSI)
STATE列でパーティショニングされていないAREA_CODESテーブルを前提として、以下のCREATE INDEX文はAREA_CODESテーブルにDPSIを作成します。
CREATE INDEX DPSIIX2 ON AREA_CODES (STATE) PARTITIONED;

以下のクエリ例は、例示したDPSIを効率的に使用することができます。 検索が必要なキー値の数は、条件を満たすパーティションのキー値のみに限定されます。条件を満たすパーティションとは、パーティショニングキー値が300以下であるパーティションのみです。

SELECT STATE FROM AREA_CODES
 WHERE AREACODE_NO <= 300 AND STATE = 'CA';
STATE列の非分割インデックス(NPI)
AREA_CODESテーブルがSTATE列でパーティショニングされていないと仮定すると、以下のCREATE INDEX文はAREA_CODESテーブルにNPIを作成します。

CREATE INDEX NPSIIX3 ON AREA_CODES (STATE); 

以下のクエリは、例として挙げたNPIを効率的に利用することができます。 検索が必要なキー値の数は、'CA'より大きいインデックスキー値をスキャンするのに限定されます。

SELECT STATE FROM AREA_CODES
 WHERE STATE > 'CA';

次の図は、例のインデックスの構造を示しています。

図3: AREA_CODESテーブルのDPSIとNPI
図の説明の開始 先行の SQL ステートメントからの索引に対する表の関係。 図の説明の終わり。
汎用プログラミングインターフェース情報の終了。

DPSI は、ユーティリティー処理の場合に NPI より大きな利点があります。 例えば、COPY、REBUILD INDEX、および RECOVER INDEX などのユーティリティーは、論理パーティションではなく物理パーティションで操作できます。これは、データ・パーティションのキーが、単一 DPSI パーティションに常駐しているからです。 この方法により、可用性が高くなります。