変更状態索引

変更状態索引は、 カラム・オーガナイズ 表に対する索引スキャンの currently committed セマンティクスの実装で使用される、システム生成の索引です。

変更状態索引は、 カラム・オーガナイズ 表に対する以下のいずれかのアクションの結果として作成されます。
  • CREATE INDEX ステートメントを使用して索引が明示的に作成される。
  • 既に存在する索引の作成が試みられる。 この場合は警告メッセージ SQL0605W が返されますが、変更状態索引が作成されます。
  • 主キーまたはユニーク・キーが作成され、DB2_EXTEND_COL_UNIQUE_INDEX_ACCESS レジストリー変数が 'ON' に設定されている。

変更状態索引は、最初の CREATE INDEX ステートメントが カラム・オーガナイズ 表に対して実行されるときに作成されます。

デフォルトでは、ユニーク・キー制約または主キー制約を作成しても変更状態索引は作成されません。 レジストリー変数 DB2_EXTEND_COL_UNIQUE_INDEX_ACCESS が 'ON' に設定されると、適用される主キー制約またはユニーク制約の作成時に変更状態索引が生成されます。

既存の索引を使用する索引アクセス・プランの数を増やすことができます。 増やすには、1 次索引またはユニーク索引と一致する定義を指定して CREATE INDEX ステートメントを発行し、変更状態索引を作成します。 この手順の例は、 使用法のシナリオに記載されています。 可能な新しいタイプの索引アクセス・プランについて詳しくは、 カラム・オーガナイズ表の Explain 情報 を参照してください。

使用法のシナリオ

この使用法シナリオでは、既に存在する主キー制約またはユニーク制約の索引に一致する索引を作成しようとしたときに変更状態索引が生成されます。 既存の索引を使用する SQL ステートメントのタイプを増やすには、この手順に従ってください。
  1. 索引の名前を取得し、MDST タイプの索引が存在しないことを確認します。
    db2 "select substr(indname,1,25) indname, indextype from syscat.indexes
         where tabschema='TEST1' and tabname = 'T1' and indextype in ('REG','MDST')"
    この照会は、以下の出力を戻します。
    INDNAME                   INDEXTYPE
    ------------------------- ---------
    SQL171120105642950        REG
  2. 索引内の列名を取得します。
    db2 "select substr(indname,1,35) indname, substr(colname, 1, 10) colname, COLSEQ, COLORDER
         from syscat.indexcoluse where indname = 'SQL171120105642950'"
    
    この照会は、以下の出力を戻します。
    INDNAME                             COLNAME    COLSEQ COLORDER
    ----------------------------------- ---------- ------ --------
    SQL171120105642950                  COL2            1 A
    SQL171120105642950                  COL1            2 A
    
  3. 主キー制約またはユニーク制約と同じ列を使用する索引を作成します。
    db2 "create index I1 on TEST1.T1 (col2,col1)"
    
    SQL0605W  The index was not created because an index
    "SYSIBM.SQL171120105642950" with a matching definition already exists.
    SQLSTATE=01550
  4. 変更状態索引が作成され、通常の索引は作成されていないことを確認します。
    db2 "select substr(indname,1,25) indname, indextype from syscat.indexes
         where tabschema='TEST1' and tabname = 'T1' and indextype in ('REG','MDST')"
    
    この照会は、以下の出力を戻します。
    INDNAME                   INDEXTYPE
    ------------------------- ---------
    SQL171120105642950        REG
    SQL171120105649725388     MDST