Share via


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

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

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

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

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

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

  • 更新の必要が少なく、容量の大きいデータベースまたはテーブルの場合、クエリのパフォーマンスを向上させるには非クラスター化インデックスを多数作成するのが適しています。テーブル全体の非クラスター化インデックスと比較してクエリのパフォーマンスが向上し、インデックスのストレージ コストとインデックスのメンテナンス コストが削減されるように、適切に定義されたデータのサブセットに対してフィルター選択されたインデックスを作成することを検討してください。

    読み取り専用データが中心の意思決定支援システム アプリケーションおよびデータベースは、非クラスター化インデックスを多数作成するのが適しています。非クラスター化インデックスを多数作成すると、クエリ オプティマイザーにより最速のアクセス手段が判断される際の選択肢になるインデックスが多く、データベースの更新頻度が低いのでインデックスのメンテナンスによってパフォーマンスが低下することはありません。

  • テーブルの更新頻度が高いオンライン トランザクション処理アプリケーションおよびデータベースに、インデックスを過度に作成することはお勧めしません。また、インデックスの列数はできる限り抑えてください。

    1 つのテーブルに多数のインデックスがあると、テーブル内のデータが変更された場合にインデックスをすべて調整する必要があるので、INSERT、UPDATE、DELETE、および MERGE の各ステートメントのパフォーマンスに影響します。

クエリに関する注意点

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

  • JOIN 句または GROUP BY 句を使用している。

    結合操作やグループ化操作に使用する列の非クラスター化インデックスを複数作成し、外部キー列にクラスター化インデックスを作成してください。

  • 大きな結果セットを返さないクエリ。

    大きなテーブルから適切に定義された行のサブセットを返すクエリに対応するために、フィルター選択されたインデックスを作成してください。

  • 完全一致を返すクエリの検索条件 (WHERE 句など) に頻繁に使用される列を含んでいる。

列に関する注意点

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

  • クエリを包括している。

    インデックスにクエリのすべての列が含まれていると、パフォーマンスが向上します。クエリ オプティマイザーではインデックス内ですべての列値を参照できるので、テーブルやクラスター化インデックスのデータにアクセスすることがなく、ディスク I/O 操作が少なくてすみます。列数の多いインデックス キーを作成する代わりに、包括する列を追加するには、付加列インデックスを使用します。詳細については、「付加列インデックス」を参照してください。

    テーブルにクラスター化インデックスがある場合、クラスター化インデックスに定義された列がテーブルの各非クラスター化インデックスの末尾に自動的に付加されます。その結果、非クラスター化インデックスの定義にクラスター化インデックスの列を指定することなく、インデックスにはクエリで使用するすべての列が含まれることになります。たとえば、あるテーブルの列 C にクラスター化インデックスがある場合、列 B および A の非クラスター化インデックスのキー値は列 B、A、および C となります。

  • 姓と名の組み合わせなど、多数の異なる値が格納されている (他の列にクラスター化インデックスが使用されている場合)。

    1 と 0 のみなど異なる値が少数しかない場合、テーブル スキャンを行う方が通常は効率的なので、ほとんどのクエリではインデックスが使用されません。このようなデータの場合は、少数の行のみに含まれる異なる値に対してフィルター選択されたインデックスを作成することを検討してください。たとえば、ほとんどの値が 0 の場合は、クエリ オプティマイザーで 1 を含むデータ行に対してフィルター選択されたインデックスを使用できます。

インデックス オプション

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

  • FILLFACTOR

  • ONLINE

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