物理設計・インデックス・障害回復 重要度:★★★出題: AM2・PM1・PM2
複合索引(Composite Index)とカバリング索引(Index-Only Scan)
ふくごうさくいんとかばりんぐさくいん / Composite Index & Covering Index (Index-Only Scan)
複数の列を組み合わせて定義した索引(複合索引)と、クエリが参照するすべての列を索引内に含めることでデータページへのアクセスをゼロにする最適化技法(カバリング索引)。
3行速習ポイント
- 複合索引 `(列A, 列B, 列C)` は先頭からの列順でソートされているため、`WHERE 列A = ?` や `WHERE 列A = ? AND 列B = ?` では効率よくレンジスキャンできる
- 先頭列で範囲条件(不等号やBETWEEN)を使うと、それ以降の列(列B, 列C)はB+木の探索範囲絞り込みには使えないため、「等値条件の列を先頭、範囲条件の列を後ろ」に配置するのが原則
- SELECT句・WHERE句・GROUP BY句・ORDER BY句で必要な列がすべて索引に含まれていれば、リーフページを読むだけでクエリが完結(Index-Only Scan)する
図解
図複合索引の列順序設計とIndex-Only Scan
11. 先頭列:等値条件(=)
第1キーWHERE 部門コード = ? でB+木の探索範囲をピンポイントに絞り込む
22. 後続列:範囲条件・ORDER BY
第2キーAND 売上日 BETWEEN ? AND ? ORDER BY 売上日 でリーフを連続走査しソートも省略
33. 付加列:SELECT出力列
Index-Only ScanSELECT句の参照列も索引に含めることでテーブル本体へのアクセスをゼロ化
概要と本質
午後I・午後IIの物理設計・SQLチューニング問題で極めて重要な設計ルールです。「どの列の組み合わせ・どの順序で複合索引を定義すべきか」を問う設問では、WHERE句の等値条件・範囲条件・ORDER BY句の並び順を総合的に見て判断します。
重要ポイント・コア概念
- 複合索引の列順の鉄則:①等値条件(`=`)で指定される列 → ②範囲条件(`BETWEEN`, `>=`, `<=`)またはソート(`ORDER BY`)・グループ化(`GROUP BY`)で指定される列 の順に並べる
- ソート処理の省略:ORDER BY句の列順が複合索引の並び順と一致していれば、メモリや一時ディスクを使ったソート処理を省略できる
- INCLUDE句(付加列索引):検索条件には使わないがSELECT句で取得する列をリーフページのみに付加し、B+木の中間ノード肥大化を抑えつつIndex-Only Scanを実現する手法
午後I・午後II記述試験での攻略ポイント
午後試験で「SQL文の性能を改善するために追加すべき索引の列名と順序を答えよ」と問われたら、まずWHERE句で `=` 指定されている列を先頭に置き、次に `BETWEEN` や `ORDER BY` で使われている列を配置してください。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える