3.1 CREATE INDEXインデクスの定義

<この節の構成>
(1) 機能
(2) 形式
(3) 規則
(4) 留意事項
(5) 使用例

(1) 機能

表にインデクスを定義します。

CREATE INDEX文は,定義系SQL文記述ファイルに記述します。定義系SQL文記述ファイルについては,マニュアル「TP1/EE/Extended Data Cache 使用の手引」を参照してください。

(2) 形式

インデクス定義::=
CREATE 〔UNIQUE〕 INDEX インデクス名
   ON 表名 (列名〔{ASC|DESC}〕〔,列名 〔{ASC|DESC}〕〕…)
    インデクス用DBエリア指定
   〔インデクスオプション〕…

インデクス用DBエリア指定::=IN DBエリア名
インデクスオプション::={インデクス未使用領域指定|セグメント再利用指定}
インデクス未使用領域指定::=PCTFREE=未使用領域の比率
   未使用領域の比率::=符号なし整数定数
セグメント再利用指定::=SEGMENT REUSE {再利用契機セグメント数
             |(再利用契機セグメント数〔,再利用契機セグメント数増分値〕)
              |(,再利用契機セグメント数増分値)
               |NOUSE}
   再利用契機セグメント数::=符号なし整数定数
   再利用契機セグメント数増分値::=符号なし整数定数

(a) UNIQUE

インデクスを定義するキー値(インデクスとして定義する一つまたは複数の列の全体の値)が,すべての行で異なっている場合に指定します。このようなインデクスをユニークインデクスと呼びます。

UNIQUEを指定している場合に,インデクスの作成または更新時に重複キー値を検出すると,エラーを返します。ただし,ナル値を含むキー値の場合,重複した値があっても重複キーにはなりません。

(b) インデクス名

定義するインデクスのインデクス名を指定します。インデクス名はシステム内で重複できません。インデクス名については,「1.2.8 名前の修飾」を参照してください。

(c) 表名

インデクスを定義する表の表名を指定します。表名については,「1.2.8 名前の修飾」を参照してください。

(d) 列名 〔{ASCDESC}〕〔,列名 〔{ASC|DESC}〕〕…)

インデクスを定義する列の列名およびインデクスの並び順を指定します。

列名
インデクスを定義する列の名称を指定します。
列名は,最大16個指定できます。
列名を複数個指定する場合は,同じ名称は指定できません。
ASC
インデクスを昇順に定義する場合に指定します。
DESC
インデクスを降順に定義する場合に指定します。
(e) インデクス用DBエリア指定

インデクス用DBエリア指定::=IN DBエリア名

この指定は省略できません。必ず指定してください。

インデクスを格納するインデクス用DBエリア名を指定します。表用DBエリアは指定できません。

(f) インデクスオプション

インデクスオプションには,同一のオプションを繰り返して指定できません。

(g) インデクス未使用領域指定

インデクス未使用領域指定::=PCTFREE未使用領域の比率

インデクス作成時のインデクスページ内の未使用領域の比率を指定します。

インデクス未使用領域指定は次の場合に適用されます。そのほかの場合は,PCTFREE=0が仮定されます。

未使用領域の比率
未使用領域の比率は,0~99(単位:%)を指定します。この指定を省略すると,30%が仮定されます。
インデクスを定義したあと,行の追加が頻繁に発生する場合,未使用領域の比率を高く設定してください。
未使用領域の指定については,マニュアル「TP1/EE/Extended Data Cache 使用の手引」の「ページ内の未使用領域の設定」を参照してください。
(h) セグメント再利用指定

セグメント再利用指定::=SEGMENT REUSE
   {再利用契機セグメント数
  |(再利用契機セグメント数〔,再利用契機セグメント数増分値〕)
   |(,再利用契機セグメント数増分値)
    |NOUSE}

インデクスはページを再利用する契機がないため,通常はこの指定を行わないでください。

セグメントの再利用機能を使用する場合に,セグメントの再利用を実行する契機(再利用契機セグメント数または再利用契機セグメント数増分値)を指定します。

セグメントの再利用とは,使用中のインデクスが管理するセグメントで,最後に確保したセグメント内の空きページを使い切った場合,新規セグメントを確保しないで,そのインデクスが管理するセグメントから空きページを検索して,割り当てることをいいます。

この指定を省略した場合は,NOUSEを指定したものとして扱います。

再利用契機セグメント数
セグメントの再利用を実行する契機となるセグメント数を指定します。
再利用契機セグメント数には,0~16777216の符号なし整数を指定できます。
再利用契機セグメント数を省略した場合は,0が仮定されます。
1以上を指定した場合:
確保したセグメント数が,指定した再利用契機セグメント数に達した場合に,セグメントの再利用を実行します。ただし,確保したセグメント数が再利用契機セグメント数に達する前に,新規セグメントが確保できなくなると,その時点でセグメントの再利用を実行します。
セグメントの再利用を実行したあと,次回,空きページを検索する場合は,前回,割り当てたページを起点とします。
0を指定した場合:
新規セグメントが確保できなくなったときにセグメントの再利用を行います。
セグメントの再利用を実行したあと,次回,空きページを検索する場合は,前回,割り当てたページを起点とします。
再利用契機セグメント数増分値
再利用契機セグメント数の増分値を指定します。
再利用契機セグメント数増分値には,0~16777216の符号なし整数を指定できます。
再利用契機セグメント数増分値を省略した場合は,0が仮定されます。
1以上を指定した場合:
セグメントの再利用の実行時,そのインデクスが管理するセグメントに空きページがなくなり,新規セグメントを確保した場合,新たな再利用契機セグメント数を決定するための増分値を指定します。再利用契機セグメント数に増分値を加算した値を新たな再利用契機セグメント数とします。ただし,確保したセグメント数が再利用契機セグメント数に達する前に,新規セグメントが確保できなくなると,その時点でセグメントの再利用を実行します。
0を指定した場合:
再利用契機セグメント数を増分しません。
確保したセグメント数が再利用契機セグメント数を超えたあとは,新規セグメントが確保できなくなった時点で,セグメントの再利用を実行します。
NOUSE
セグメントの再利用機能を使用しない場合に指定します。
新規セグメントが確保できなくなったときに,セグメントの再利用を実行します。
セグメントの再利用を実行したあと,次回,空きページを検索する場合は,前回,割り当てたページを起点とします。

(3) 規則

  1. XDBUSERが所有するインデクスを定義できます。
  2. XDBUSERが所有する表にインデクスを定義できます。
  3. インデクスは,一つの表に最大16個定義できます。
  4. インデクスはシステム内に最大2048個定義できます。ただし,一つのDBエリアに格納できるインデクスは400個です。
  5. インデクスは,次のデータ型の列に対して定義できません。
    • 精度が20けた以上のDECIMAL型
  6. 単一列インデクスを定義する場合,インデクスを定義する列の定義長が次に示す値以下である必要があります。

    MIN{(a÷2)-100,4036} (単位:バイト)

    a:インデクス用DBエリアのページサイズ
  7. 単一列インデクスに対してDESCを指定した場合は,ASCを指定したものとして扱います。
  8. 次のインデクスは複数個定義できません。
    • 列構成が同じであり,かつすべての列の昇順,降順の指定が同じであるインデクス
    • 列構成が同じであり,かつすべての列の昇順,降順の指定が逆であるインデクス
  9. 複数列インデクスは,次の表に示すデータ型の列に対して定義できます。複数列インデクスを構成する列の長さはデータ型によって異なります。各列の長さの合計長が次の値以下であれば,複数列インデクスを定義できます。

    MIN{(a÷2)-100,4036} (単位:バイト)

    a:インデクス用DBエリアのページサイズ

    表3-1 複数列インデクスを構成する列の長さ

    項番データ型複数列インデクスを構成する列の長さ※1
    各列の長さの合計が255バイト以下の場合各列の長さの合計が256バイト以上の場合
    構成列が固定長だけの場合構成列に可変長を含む場合※3
    1INTEGER556
    2SMALLINT※2334
    3DECIMAL(m,n)↓m÷2↓+2↓m÷2↓+2↓m÷2↓+3
    4CHAR(n)n+1n+1n+2
    5VARCHAR(n)※2n+1n+2
    6TIMESTAMP(p)8+p÷28+p÷29+p÷2
    7ROWID※2131314
    (凡例)
    m,n:正の整数
    p:{0|2|4|6}
    -:該当しません。
    注※1
    「各列の長さの合計が255バイト以下の場合」の列長を基に計算した結果,合計が256バイト以上になったときには,「各列の長さの合計が256バイト以上の場合」を基に列の長さを計算し直してください。
    注※2
    これらのデータ型は作業表だけで使用します。そのため,CREATE TABLE文でこれらのデータ型を指定することはできません。
    注※3
    作業表だけに該当する説明です。

(4) 留意事項

  1. 複数列インデクスを定義する場合,各列の指定順位は,キー値作成の優先順位になります。
  2. 単一列インデクスが定義されている列にも,複数列インデクスを定義できます。

(5) 使用例

(例1)
飲食店表(INSHOKU)に次に示す条件でインデクスを定義します。
  • 飲食店表の店舗コード(SHOP_CODE)列に,重複キーがない(UNIQUE),昇順のインデクス(IDX1)を定義します。
  • 行の追加が頻繁に発生すると予想されるため,インデクスページ内の未使用領域の比率を50%にします。
  • インデクスはDBIDX001という名称のインデクス用DBエリアに格納します。

CREATE UNIQUE INDEX "IDX1" ON "INSHOKU"("SHOP_CODE" ASC)
IN DBIDX001 PCTFREE = 50

(例2)
飲食店表(INSHOKU)に次に示す条件で複数列インデクスを定義します。
  • 飲食店表の店舗コード(SHOP_CODE)列と地域コード(AREA_CODE)列を組にして,店舗コードを昇順に,地域コードを降順にした複数列インデクス(IDX3)を定義します。
  • インデクスはDBIDX001という名称のインデクス用DBエリアに格納します。

CREATE INDEX "IDX3" ON "INSHOKU"
   ("SHOP_CODE" ASC,"AREA_CODE" DESC)
IN DBIDX001