インデックスのデザインの基礎

不完全なデザインのインデックスやインデックスの不備は、データベース アプリケーションのボトルネックの主な原因となります。効率的なインデックスのデザインは、データベースとアプリケーションの高パフォーマンスを実現するための最優先事項です。データベースとワークロードに適したインデックスの選択は、クエリの速度と更新コストのバランスを取る必要がある複雑な作業です。インデックス キー内の列数が少ないインデックスを使用すると、ディスク領域とメンテナンスのオーバーヘッドが少なくて済みます。これに対して、列数の多いインデックスを使用すると、より多くのクエリに対応できます。効率の高いインデックスを決定するには、さまざまなデザインをテストする必要があります。インデックスは、データベース スキーマやアプリケーションのデザインに影響を与えずに追加、変更、および削除できます。さまざまなデザインのインデックスを積極的にテストするようにしてください。

SQL Server のクエリ オプティマイザでは、多くの場合、最も効率的なインデックスが選択されます。インデックスのデザインの全体的な考え方としては、クエリ オプティマイザでインデックスを選択するための選択肢として、さまざまなデザインのインデックスを用意し、オプティマイザに決定を任せる必要があります。このようにすると、分析時間を短縮でき、さまざまな状況でパフォーマンスを向上できます。クエリ オプティマイザで特定のクエリに使用されるインデックスを確認するには、SQL Server Management Studio で、[クエリ] メニューの [実際の実行プランを含める] をクリックします。詳細については、「実際の実行プランを表示する方法」を参照してください。

インデックスを使用しても、常にパフォーマンスが向上するわけではありません。また、パフォーマンスが優れていても、常にインデックスが効率的に使用されているわけでもありません。インデックスを使用すれば常にパフォーマンスが向上するならば、クエリ オプティマイザのジョブは単純です。しかし実際には、不適切なインデックスを選択すると、最適なパフォーマンスを実現することはできません。したがって、クエリ オプティマイザでは、パフォーマンスの向上につながる場合にのみインデックスまたはインデックスの組み合わせが選択され、パフォーマンスの低下につながる場合、インデックス付き検索は実行されません。

インデックスのデザインの作業

インデックスをデザインするには、次の作業を行うことをお勧めします。

  1. データベース自体の特性を理解します。たとえば、データが頻繁に変更されるオンライン トランザクション処理 (OLTP) データベースであるか、主に読み取り専用データが格納されている意思決定支援システム (DSS) データベースまたはデータ ウェアハウジング (OLAP) データベースであるかを理解する必要があります。詳細については、「オンライン トランザクション処理と意思決定支援」を参照してください。

  2. 最もよく使用されるクエリの特性を理解します。たとえば、よく使用されるクエリの中に、複数のテーブルを結合するクエリがあることを把握していると、使用する最適なインデックスの種類を決定するときに役立ちます。詳細については、「インデックスの設計の全般的なガイドライン」を参照してください。

  3. クエリで使用される列の特性を理解します。たとえば、整数データ型を格納する列で、一意の列または NULL 値を許容しない列であれば、インデックスに適しています。フィルタ選択されたインデックスは、適切に定義されたデータのサブセットが含まれている列に適しています。詳細については、「フィルタ選択されたインデックスのデザイン ガイドライン」を参照してください。

  4. インデックスの作成時またはメンテナンス時のパフォーマンスを向上させるインデックス オプションを決定します。たとえば、既存の大きなテーブルにクラスタ化インデックスを作成する際には ONLINE インデックス オプションが有益です。ONLINE オプションを使用すると、インデックスの作成中または再構築中に、基になるデータで同時処理を続行できます。詳細については、「インデックス オプションの設定」を参照してください。

  5. インデックスの最適な格納場所を決定します。非クラスタ化インデックスは、基になるテーブルと同じファイル グループまたは別のファイル グループに格納できます。インデックスの格納場所により、ディスク I/O のパフォーマンスが向上し、その結果クエリのパフォーマンスを向上させることができます。たとえば、非クラスタ化インデックスを、テーブル ファイル グループとは別のディスク上にあるファイル グループに格納すると、複数のディスクを同時に読み取ることができるため、パフォーマンスが向上します。詳細については、「ファイル グループへのインデックスの格納」を参照してください。

    また、クラスタ化インデックスと非クラスタ化インデックスでは、複数のファイル グループにまたがってパーティション構成を使用できます。大きなテーブルやインデックスをパーティション分割すると、コレクション全体の整合性を維持しながら、データのサブセットに対するアクセスや管理を迅速かつ効率的に行うことができるので、大きなテーブルやインデックスを管理しやすくなります。詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。パーティション分割を検討するときは、インデックスを固定するかどうかを決定します。つまり、基本的にテーブルと同じ方法でパーティション分割するか、または別の方法でパーティション分割するかを決定するということです。詳細については、「パーティション インデックスの専用ガイドライン」を参照してください。

これらの作業の詳細については、「インデックスの設計の全般的なガイドライン」を参照してください。