索引

索引とは・・・高速にROWIDを検索して、要求された行を特定するための仕組み
索引の構成
ルートブロック→ブランチブロック→リーフブロック 索引リーフエントリには、エントリヘッダ(列の数とロック情報) キーの列長、列値、行のROWIDが格納されている。
標準B*ツリー索引のリーフエントリの特徴
 ・同じキー値を持つ行が複数ある場合、キー値は繰り返される
 ・全てのキー列がNULLである行に対応する索引エントリはない
 ・全ての行は同じセグメントに属するため、表の行を指すにはROWIDを使う
逆キー索引
 索引キーのバイト値を反転させた索引のこと。
 範囲検索には利用されない。
CREATE INDEX [スキーマ名.]索引名 ON [スキーマ名.]表名
  (列名 ,列名 ...) REVERSE;
ビットマップ索引
  エントリには、開始ROWID/終了ROWID/列値/ビットマップセグメントをもつ。
  表の中の索引列が更新されるときに、ビットマップセグメント全体がロックされるため、
  最初のトランザクションが終了するまで、そのほかのトランザクションは行を更新することができない。
標準B*ツリー索引の作成
  NOSORTではなくREVERSEを指定すると逆キー索引
  列には関数を含んだ項目を指定することも可能
  CREATEの後ろをBITMAPにすると、ビットマップ索引になる。

  ビットマップに割り当てるメモリ量はCREATE_BITMAP_AREA_SIZEで指定。
CREATE [UNIQUE] INDEX [スキーマ名.]索引名 ON [スキーマ名.]表名
(列 [ASC | DESC] [,列 [ASC | DESC] ...])
 [TABLESPACE 表領域名]
   [PCTFREE 開き領域割合]
   [PCTUSED 使用領域割合]
   [INITRANS トランザクションスロット初期数]
   [MAXTRANS トランザクションスロット最大数]
   [STORAGE ( [INITIAL 初期エクステントサイズ [K | M] ]
              [NEXT 増分エクステントサイズ [K | M] ]
              [MINEXTENTS 作成時エクステント数]
              [MAXEXTENTS {最大エクステント数 | UNLIMITED}]
              [PCTINCREASE エクステントサイズ拡大率])
   [LOGGING | NOLOGGING]
   [NOSORT];
記憶領域パラメータ、ブロック領域管理パラメータについて
  基本的にテーブルと同じ。
  エクステントの手動割り当てや、未使用領域の割り当ての解放などもできる。
索引の再構成
  8.0以前は表がロックされる。
  8i以降はオンライン索引構築を使うことで、複数のDML操作を同時に実行できる。
ALTER INDEX [スキーマ名.]索引名 REBUILD
 [TABLESPACE 表領域名]
   [PCTFREE 開き領域割合]
   [PCTUSED 使用領域割合]
   [INITRANS トランザクションスロット初期数]
   [MAXTRANS トランザクションスロット最大数]
   [STORAGE ( [INITIAL 初期エクステントサイズ [K | M] ]
              [NEXT 増分エクステントサイズ [K | M] ]
              [MINEXTENTS 作成時エクステント数]
              [MAXEXTENTS {最大エクステント数 | UNLIMITED}]
              [PCTINCREASE エクステントサイズ拡大率])
   [LOGGING | NOLOGGING]
   [REVERSE | NOREVERSE];
※オンライン索引再構築
ALTER INDEX インデックス名 REBUILD ONLINE;
索引の結合
ALTER INDEX [スキーマ名.]索引名 COALESCE;
索引の妥当性チェック
  実行結果はINDEX_STATSに格納
ANALYZE INDEX [スキーマ名.]索引名 VALIDATE STRUCTURE;
未使用索引の監視
  V$OBJECT_USAGEを使用して、索引が一度でも使用されたか確認できる。(9iから)
索引に関する情報の取得
DBA_INDEXES/DBA_IND_COLUMNSから取得