クラスタ化インデックスと非クラスタ化インデックスの両方を定義する場合は、非クラスタ化インデックスを定義する前に、クラスタ化インデックスを定義します。手順が逆になると、クラスタ化インデックスの定義時に物理的な並べ替えが発生するため、その時点で定義されていた非クラスタ化インデックスの再構築が行われてしまい、効率が悪いためです。また、非クラスタ化インデックスを使用したクエリでBETWEEN句を使用した範囲検索を行うと、繰り返しクラスタ化インデックスを使用したアクセスが発生し、効率が悪くなる場合があります。
上記の例で使用しているクエリでは選択リストに「*」(アスタリスク)を使用していますが、その記述を以下のように書き換えてみたらどうでしょうか。
SELECT 姓,生年月日 FROM 顧客 WHERE 生年月日 BETWEEN '1951/5/10' AND '1967/6/20'
このクエリでは、SELECT文で参照される列のデータは、すべて非クラスタ化インデックスのリーフ・ページに含まれていることが分かります。このクエリを実行した場合、インデックス内の検索は非クラスタ化インデックスのリーフ・ページまでで済んでしまうため、クラスタ化インデックスを使用してデータページまでアクセスする必要がありません。このようなインデックスのことを「クエリをカバーするインデックス」と呼びます。クエリをカバーするインデックスは非クラスタ化インデックスで使用できます。
これで本連載は終了します。ご愛読、ありがとうございました。(連載完)
Copyright © ITmedia, Inc. All Rights Reserved.