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