索引とは・・・高速に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から取得