Hitachi

ノンストップデータベース HiRDB Version 10 システム導入・設計ガイド(UNIX(R)用)


12.2.1 インデクスの作成

〈この項の構成〉

(1) インデクスの効果

性能の向上

表を検索するときのキーとなる列にインデクスを作成しておくと,表の検索性能が向上します。詳細は,マニュアル「HiRDB 解説」の「インデクスの基本構造」を参照してください。

(2) 適用基準

(a) インデクス作成に適している列

インデクス作成に適している列を次に示します。

  • データを絞り込むための条件に使用する列

    探索条件に使用する列にインデクスを作成すると,条件を満たすデータを効率良く取り出せます。

  • 表の結合処理の条件として使用する列

    表を結合する場合は,結合列にインデクスを作成することで,効率の良い結合処理ができます。特に,結合列に指定することが多い外部キーには,インデクスを作成してください。

  • ORDER BY,GROUP BYに指定する列

    探索条件に使用する列に加えて,ORDER BY,GROUP BYに指定する列をインデクス構成列に含めると,HiRDBが実行するソート処理を省略できることがあるため,効率良く処理ができます。ソート処理を省略できる条件については,マニュアル「HiRDB コマンドリファレンス」の「アクセスパス表示ユティリティ(pdvwopt)」の「ORDER BY,GROUP BYを指定した検索に使用する表のインデクス定義」を参照してください。

インデクスを構成する列の組み合わせや順序については,「インデクス構成列の検討」を参照してください。

(b) インデクス作成に適さない列

次に示す列にインデクスを作成すると性能が低下するため,インデクス作成には適していません。

  • 更新頻度の高い列

  • データの重複度が高い列(データの種類が少ない列)

それぞれの理由について,次に説明します。

  • 更新頻度の高い列

    • 更新SQLの性能への影響

      インデクス構成列の値を更新すると,キー値も更新されます。このインデクスメンテナンスは,更新SQLの延長で実行されるため,更新SQLの実行頻度が高い場合は,性能が低下します。

    • インデクス格納ページの断片化

      インデクスのキー値はキー値順に並んで格納されているため,キー値が更新されると格納位置が変わり,インデクスのページには断片化した空き領域が発生します。更新SQLの実行頻度が高い場合は,断片化の進行が早いため,次のインデクス再編成を実行するまでに,インデクスを使用した検索性能が低下します。

      図12‒1 インデクスページの断片化による検索性能への影響

      [図データ]

      [図データ]

  • データの重複度が高い列(データの種類が少ない列)

    データの重複度が高い列とは,例えば,0と1の2種類の値しか持たないフラグやステータス情報を設定する列が該当します。このような列に対して単一列インデクスを作成しても,行を絞り込めないため,大量の行にアクセスします。インデクスを使った検索は,行の格納順序は意識しないランダムなアクセスです。したがって,大量の行にアクセスすると,インデクスを使用しない場合よりも時間が掛かることがあります。

    図12‒2 フラグ列のインデクスを使用した検索処理の例

    [図データ]

    データの重複度が高い列に対して探索条件を指定する場合は,ほかの探索条件に指定した列にインデクスを作成して,絞り込んでください。絞り込めない場合は,データの重複度が高い列も組み合わせて,複数列インデクスを作成してください。この場合,インデクス構成列の順序は,データの重複度が高い列を一番後ろにしてください。

(3) 作成方法

表にインデクスを作成するには,定義系SQLのCREATE INDEXを実行します。

(4) 共通規則

  1. 一つの表に最大255個のインデクスを定義できます。

  2. ナル値を含む列又は行のない列に対してもインデクスを定義できます。

  3. ビュー表にはインデクスを作成できません。

(5) インデクスを定義できないデータ型

次に示すデータ型の列にはインデクスを定義できません。

(6) インデクスのキー長の上限

インデクスのキー長は,次に示す条件を満たす必要があります。この条件を満たさないとインデクスを定義できません。

インデクスのキー長(バイト)
≦MIN{(インデクス格納RDエリアのページサイズ÷2)−1242,4036}

インデクス格納RDエリアのページサイズが4096バイトの場合は,キー長が最大806バイトのインデクスが定義できます。インデクスのキー長については,表「インデクスのキー長一覧」を参照してください。

なお,複数列インデクスの場合は,複数列インデクスを構成する各列のキー長の合計がインデクスのキー長となります。

(7) 注意事項

一つの表に同じインデクスを二つ以上作成できません。異なるインデクス名であっても同じインデクスと扱われる場合の例を次に示します。

●単一列インデクスの場合
CREATE INDEX インデクス1 ON 表1 (列1 ASC)
CREATE INDEX インデクス2 ON 表1 (列1 DESC)

この場合,インデクス2はインデクス1と同じインデクスとして扱われます。このため,先に定義したインデクス1が有効になります。

●複数列インデクスの場合
CREATE INDEX インデクス1 ON 表1 (列1 ASC,列2 ASC)
CREATE INDEX インデクス2 ON 表1 (列1 DESC,列2 DESC)

又は

CREATE INDEX インデクス1 ON 表1 (列1 ASC,列2 DESC)
CREATE INDEX インデクス2 ON 表1 (列1 DESC,列2 ASC)

この場合,インデクス1とインデクス2は同じインデクスとして扱われます。このため,先に定義したインデクス1が有効になります。なお,次に示す場合は,互いに異なるインデクスになります。

CREATE INDEX インデクス1 ON 表1 (列1 DESC,列2 DESC)
CREATE INDEX インデクス2 ON 表1 (列1 ASC,列2 DESC)