CREATE INDEX
製品_
分類_idx ON
製品表(
分類);
CREATE INDEX 製品_種別_idx ON
製品表(
種別);
複合索引
複数列にまとめて一つの索引を作成
• 単一列索引と複合索引の作成例
• 複合索引の構造
•
指定した索引列のデータが、指定した列の順にソートされて、リーフ・ブロックに 格納される•
単一列索引を3
つ読み、マージするよりも効率的複合索引(コンポジット索引)
複合索引の構造
親コード 分類 種別
1 A
あ ROWID1 A
い ROWID1 A
う ROWID1 B
あ ROWID1 B
え ROWID1 C
あ ROWID2 A
あ ROWID2 A
う ROWID2 B
あ ROWID2 C
あ ROWID2 C
い ROWID3 A
い ROWID・・・ ・・・ ・・・ ・・・
ルート ブロック
ブランチ ブロック
リーフ ブロック
一つ目のキー列を元に B*Treeのツリー構造が構成
親コード 分類 種別 製品名
1 A
あXXX
3 B
うXXX
・・・ ・・・ ・・・ ・・・
2 A
いXXX
3 C
あXXX
・・・ ・・・ ・・・ ・・・
3 C
かXXX
2 A
さXXX
・・・ ・・・ ・・・ ・・・
1 B
いXXX
2 B
えXXX
・・・ ・・・ ・・・ ・・・
各キー列値ごとに階層的に ソートされて格納されている
複合索引(コンポジット索引)
複合索引の検索イメージ
SELECT * FROM
製品表WHERE 親コード=1
AND 分類 =‘A’
AND
種別=
‘う’;
親コード 分類 種別
1 A
あ ROWID1 A
い ROWID1 A
う ROWID1 B
あ ROWID1 B
え ROWID1 C
あ ROWID2 A
あ ROWID2 A
う ROWID2 B
あ ROWID2 C
あ ROWID2 C
い ROWID3 A
い ROWIDSELECT * FROM
製品表WHERE 親コード=1
AND 分類=‘A’;
親コード 分類 種別1 A
あ ROWID1 A
い ROWID1 A
う ROWID1 B
あ ROWID1 B
え ROWID1 C
あ ROWID2 A
あ ROWID2 A
う ROWID2 B
あ ROWID2 C
あ ROWID2 C
い ROWID3 A
い ROWID• 複合索引を使った検索例
•
索引を使って、複数の検索条件にあった行を絞り込みが可能•
索引に含まれる全ての列を指定しなくても、複合索引をつかうことが可能• 複合索引の対応条件とパフォーマンス
複合索引(コンポジット索引)
複合索引を利用できる条件
SELECT * FROM 製品表 WHERE 親コード = ?
AND 分類 = ? AND 種別 = ? ;
○:WHERE句に条件あり
×:WHERE句に条件なし
・・・
◎
・・・
○
・・・ △
・・・ ×
複合索引の使用がパフォーマンス最適 複合索引を使用可能
単一列索引より複合索引のほうが早いケースが多い
(列数や各列のサイズなどによって変わる)
9i
以降複合索引を使用可能複合索引より単一列索引のほうが早いケースが多い
(パフォーマンスが最適かどうかはデータ構造などによる)
複合索引を使用不可
親コード 分類 種別
○ ○ ○
○ ○ ×
○ × ○
○ × ×
× ○ ○
× ○ ×
× × ○
× × ×
WHRER
句の条件にどの列を使うかによって、索引を使用できるかどうか、
および、パフォーマンスが変わる
索引構成表
索引構成表とは
• データ全体を B*Tree 索引に格納している索引
•
索引のキー列だけでなく、その他の列(非キー列)もリーフブロックに格納 している索引•
索引にアクセスするだけでデータが取得できるため、より高速な検索が可能① 索引のリーフ・
ブロックから ROWIDを読む
②
ROWID
をもとに表を検索
100
①索引キー列の 検索のみで データまで到達
エントリ・ヘッダ キー列 非キー列
Suzuki 東京 20000 100 ROWID
エントリ・ヘッダ キー列
<通常の索引を使用した検索> <索引構成表を使用した検索>
ドキュメント内
Slide 1
(ページ 33-38)