非クラスタ化インデックスのデザイン ガイドライン

非クラスタ化インデックスには、インデックス キー値、およびテーブル データの格納場所を指す行ロケータが含まれています。非クラスタ化インデックスのアーキテクチャの詳細については、「非クラスタ化インデックスの構造」を参照してください。

1 つのテーブルまたはインデックス付きビューに複数の非クラスタ化インデックスを作成できます。一般に、非クラスタ化インデックスは、頻繁に使用するクエリで、クラスタ化インデックスで対応されないクエリのパフォーマンスを向上するようにデザインします。

クエリ オプティマイザでデータ値を検索するときは、本の索引を使用する場合と同じように、非クラスタ化インデックスを検索してテーブル内でのデータ値の位置を探し、その位置から直接データを取得します。非クラスタ化インデックスには、クエリの検索対象であるデータ値のテーブル内での位置を正確に記述するエントリが格納されているので、完全一致比較クエリの場合は非クラスタ化インデックスが最適です。たとえば、HumanResources.Employee テーブルに対してクエリを実行し、ある 1 人の上司に直属するすべての従業員を取得する場合、クエリ オプティマイザは ManagerID をキー列として、非クラスタ化インデックス IX_Employee_ManagerID を使用することができます。クエリ オプティマイザはこのインデックスの中から、指定された ManagerID と一致するすべてのエントリを迅速に検索できます。インデックスの各エントリのポインタは、テーブル (またはクラスタ化インデックス) の、対応するデータが見つかる正確なページおよび行を指しています。クエリ オプティマイザは、インデックスの中からすべてのエントリを検出した後、正確なページおよび行に直接移動してデータを取得できます。

データベースに関する注意点

非クラスタ化インデックスをデザインするときは、データベースの特性を考慮してください。

  • 更新の必要が少なく、容量の大きいデータベースまたはテーブルの場合、クエリのパフォーマンスを向上させるには非クラスタ化インデックスを多数作成するのが適しています。
    読み取り専用データが中心の意思決定支援システム アプリケーションおよびデータベースは、非クラスタ化インデックスを多数作成するのが適しています。非クラスタ化インデックスを多数作成すると、クエリ オプティマイザにより最速のアクセス手段が判断される際の選択肢になるインデックスが多く、データベースの更新頻度が低いのでインデックスのメンテナンスによってパフォーマンスが低下することはありません。
  • テーブルの更新頻度が高いオンライン トランザクション処理アプリケーションおよびデータベースに、インデックスを過度に作成することはお勧めしません。また、インデックスの列数はできる限り抑えてください。
    1 つのテーブルに多数のインデックスがあると、テーブル内のデータが変更された場合にインデックスをすべて調整する必要があるので、INSERT、UPDATE、および DELETE の各ステートメントのパフォーマンスに影響します。

クエリに関する注意点

非クラスタ化インデックスを作成する前に、データがどのようにアクセスされるかを理解しておいてください。次に示す特徴があるクエリには非クラスタ化インデックスを使用することを検討してください。

  • JOIN 句または GROUP BY 句を使用している。
    結合操作やグループ化操作に使用する列の非クラスタ化インデックスを複数作成し、外部キー列にクラスタ化インデックスを作成してください。
  • 大きな結果セットを返さないクエリ。
  • 完全一致を返すクエリの検索条件 (WHERE 句など) に頻繁に使用される列を含んでいる。

列に関する注意点

次に示す特徴に 1 つ以上該当する列を考慮してください。

  • クエリを包括している。
    インデックスにクエリのすべての列が含まれていると、パフォーマンスが向上します。クエリ オプティマイザではインデックス内ですべての列値を参照できるので、テーブルやクラスタ化インデックスのデータにアクセスすることがなく、ディスク I/O 操作が少なくてすみます。列数の多いインデックス キーを作成する代わりに、包括する列を追加するには、付加列インデックスを使用します。詳細については、「付加列インデックス」を参照してください。
    テーブルにクラスタ化インデックスがある場合、クラスタ化インデックスに定義された列がテーブルの各非クラスタ化インデックスの末尾に自動的に付加されます。その結果、非クラスタ化インデックスの定義にクラスタ化インデックスの列を指定することなく、インデックスにはクエリで使用するすべての列が含まれることになります。たとえば、あるテーブルの列 C にクラスタ化インデックスがある場合、列 B および A の非クラスタ化インデックスのキー値は列 BA、および C となります。
  • 姓と名の組み合わせなど、多数の異なる値が格納されている (他の列にクラスタ化インデックスが使用されている場合)。
    1 と 0 のみなど異なる値が少数しかない場合、テーブル スキャンを行う方が通常は効率的なので、ほとんどのクエリではインデックスが使用されません。

インデックス オプション

非クラスタ化インデックスを作成するときに、いくつかのインデックス オプションを指定できます。次のオプションを指定する際には特別な考慮が必要です。

  • FILLFACTOR
  • ONLINE

詳細については、「インデックス オプションの設定」を参照してください。

参照

概念

インデックスの作成 (データベース エンジン)
インデックスの設計の全般的なガイドライン
付加列インデックス

ヘルプおよび情報

SQL Server 2005 の参考資料の入手