インデックスとは、テーブルまたはビューに関連付けられたディスク上の構造で、テーブルやビューからの行の取得を高速化します。 インデックスには、テーブル内またはビュー内の 1 つ以上の列から構築されたキーが含まれています。 これらのキーは 1 つの構造 (B-Tree) 内に格納されます。SQL Server はこの構造を使用して、キー値に関連した 1 つ以上の行を効率よく迅速に検出できます。
テーブルまたはビューには、次の種類のインデックスを含めることができます。
クラスター化インデックス
クラスター化インデックスは、テーブルまたはビュー内のデータ行をそのキー値に基づいて並べ替え、格納します。 これらは、インデックス定義に含まれる列です。 データ行自体は 1 つの順序でのみ並べ替えることができるため、テーブルごとにクラスター化インデックスは 1 つだけ存在できます。
テーブル内のデータ行が並べ替えられた順に格納されるのは、テーブルにクラスター化インデックスが含まれているときだけです。 テーブルにクラスター化インデックスが含まれている場合、そのテーブルをクラスター化テーブルと呼びます。 クラスター化インデックスが含まれないテーブルのデータ行は、ヒープと呼ばれる順序付けられていない構造に格納されます。
非クラスター化インデックス
非クラスター化インデックスは、データ行とは独立した構造になっています。 非クラスター化インデックスには、非クラスター化インデックスのキー値が含まれており、各キー値のエントリにはキー値が含まれているデータ行へのポインターが含まれています。
非クラスター化インデックス内のインデックス行からデータ行を指すポインターを、行ロケーターと呼びます。 行ロケーターの構造は、データ ページがヒープまたはクラスター化テーブルのどちらに格納されているかによって異なります。 ヒープに格納されている場合、行ロケーターは行を指すポインターです。 クラスター化テーブルに格納されている場合、行ロケーターはクラスター化インデックス キーです。
非クラスター化インデックスのリーフ レベルに非キー列を追加して、既存のインデックス キー制限、900 バイト、16 個のキー列を渡し、完全にカバーされたインデックス付きクエリを実行できます。 詳細については、「 付加列インデックスの作成」を参照してください。
クラスター化インデックスと非クラスター化インデックスは共に一意インデックスにできます。 つまり、インデックス キーに同じ値を持つ 2 つの行はありません。 それ以外の場合、インデックスは一意ではなく、複数の行で同じキー値を共有できます。 詳細については、「 一意のインデックスの作成」を参照してください。
テーブル データが変更されるたびに、テーブルまたはビューのインデックスが自動的にメンテナンスされます。
その他の種類の特殊な目的 のインデックス については、「インデックス」を参照してください。
インデックスと制約
テーブル列に PRIMARY KEY 制約と UNIQUE 制約が定義されると、インデックスが自動的に作成されます。 たとえば、テーブルを作成し、特定の列を主キーとして識別すると、データベース エンジンはその列に PRIMARY KEY 制約とインデックスを自動的に作成します。 詳細については、「 主キーの作成 」および「 一意の制約の作成」を参照してください。
クエリ オプティマイザーでインデックスを使用する方法
適切に設計されたインデックスを使用すると、ディスク I/O 操作を減らし、消費するシステム リソースが少なくなるため、クエリのパフォーマンスが向上します。 インデックスは、SELECT、UPDATE、DELETE、または MERGE ステートメントを含むさまざまなクエリに役立ちます。
AdventureWorks2012 データベースのクエリ SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250について考えてみましょう。 このクエリが実行されるときに、クエリ オプティマイザーでは、データの取得に使用できる方法がそれぞれ評価され、最も効率的な方法が選択されます。 この方法は、テーブル スキャンでも、存在する場合は 1 つ以上のインデックスをスキャンすることもできます。
テーブル スキャンを実行すると、クエリ オプティマイザーはテーブル内のすべての行を読み取り、クエリの条件を満たす行を抽出します。 テーブル スキャンでは、ディスク I/O 操作が数多く行われ、リソースが集中的に使用される可能性があります。 ただし、クエリの結果セットに大部分のテーブル行が含まれる場合などは、テーブル スキャンが最も効率的な方法になることがあります。
クエリ オプティマイザーでインデックスが使用されるときは、インデックス キー列が検索され、クエリで必要とされる行のストレージの場所が検索されて、一致する行がその場所から抽出されます。 一般に、インデックスの検索はテーブルの検索よりもはるかに高速です。これは、テーブルとは異なり、インデックスに含まれる列が行ごとに非常に少なく、行が並べ替えられた順序になっていることが多いためです。
クエリ オプティマイザーでは、通常、クエリを実行するときに最も効率的な方法が選択されます。 ただし、インデックスが使用できなければ、クエリ オプティマイザーではテーブル スキャンを使用する必要があります。 クエリ オプティマイザーが効率的なインデックスを選択できるように、環境に最も適したインデックスを設計および作成する必要があります。 SQL Server にはデータベース エンジン チューニング アドバイザーが用意されており、データベース環境の分析や適切なインデックスの選択に役立てることができます。