索引構成表(IOT:Index Organized Table)

索引構成表 とは、簡単に説明するとデータ全体を最初から B-Tree インデックス に格納しているものである。表と主キーのインデックスとの共用体(⇔ C言語における構造体)になっているようなものである。

実際は B-Tree インデックスにはキーと ROWID が格納される程度なので、索引に入っているのではない。他のデータも入れることができるように拡張した表のことである。
通常であれば、表+ 主キー(インデックス)の2つのデータ領域が必要なところを索引構成表のみで実現できるため Index Only Table と書かれたドキュメントもある。

通常表・ヒープ表

索引構成表と対比して、通常の表は「ヒープ表(Heap organized Table)」と呼ばれる形式であり、データの配置(並び順)についての 「しばり」 がないためデータは様々な場所に分散して配置される。ランダムというわけではなく Oracle がそのときに都合の良い場所に配置している。

索引構成表のメリット

索引構成表は主キーの値をキーにしてソートされた状態で格納される。主キー以外のデータもインデックスのリーフ内に格納されるため 「ヒープ表+主キー(インデックス)」という構成を 「索引構成表」の1つで構成することできる。
特にテーブルスキャンがインデックススキャンに相当するので主キーによる レンジスキャン(範囲検索)の場合に有効である。
また、ヒープ表と比較してデータがソートされた状態で保存されているため、キー圧縮機能を設定した場合のキーの圧縮率が優れている。

通常表と索引構成表の違いと制約(メリット/デメリット)

マニュアルを探せばわかることであるがネット上では Oracle8(8iではない) 時代のドキュメントを元にした情報が割と多いようなので Oracle 8〜10g の仕様の歴史を昔のドキュメントから引っ張り出して整理しておく。
バージョンはそれぞれのターミナルリリース(最終リリース)である。

通常表とIOT の違い通常表索引構成表(IOT)
Oralce 8.0.4Oracle 8i(8.1.7)Oracle 9i R2Oracle 10g R2〜
一意性ROWID により一意主キー により一意同左同左同左
別のインデックス可能作成できないUROWID により作成可能同左同左
一意キーの作成可能作成できない作成できない作成可能同左
アクセス方法ROWID を用いる主キーを用いる同左UROWID を用いる同左
フルアクセス全レコード戻す全レコードを主キー順に戻す同左全レコード戻す(※1)同左
分散トランザクション
レプリケーション
可能不可能同左記載なし同左
パーティション化可能不可能レンジパーティションのみレンジ、ハッシュ(※2)レンジ、リスト、ハッシュ
LOB 列(LONG は不可)可能不可能可能同左同左
別表とのクラスタ化可能不可能同左同左同左
LogMinerサポートされる-サポートされない同左サポート(※3)
DBMS_REPAIRサポートされる-サポートされない同左同左
ダイレクトパスインサート使用できる使用できない同左同左同左

※ これらの索引構成表の制限については分散表記されたものを拾ってまとめた状態なので、かなり抜けがあると思われる。 また、マニュアルからの情報のみで実際に検証して確かめたものではない。

(※1) 主キー順で取得される保証が無くなったと思われる。

(※2) LOB を含む場合には レンジハッシュ化のみ

(※3) LOB および オーバーフローの無い索引構成表のみ

Oracle 11g R1 時点の索引構成表において仮想カラム(Virtual Column)Oracle 11g はサポートされていない。



インデックス関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー