付加列インデックスの作成
SQL Server 2005 では、インデックス キー列の他に非キー列を含めることにより、非クラスタ化インデックスを拡張できます。非キー列は、インデックス B-Tree のリーフ レベルに格納されます。
非キー列を含むインデックスは、クエリに対応している場合に、最大の効力を発揮します。つまり、そのインデックスに、クエリで参照されるすべての列が含まれる場合です。詳細については、「付加列インデックス」を参照してください。
必要なディスク領域
インデックスに非キー列を追加すると、インデックスを格納するためにより多くのディスク領域が必要になります。列の値はインデックスのリーフ レベルにコピーされますが、テーブルやクラスタ化インデックスにも残るため、特に、varchar(max)、nvarchar(max)、varbinary(max)、または xml のデータ型を非キー列として追加すると、必要なディスク領域が大幅に増加します。
付加列インデックスに必要なディスク領域を判断する手順は、非クラスタ化インデックスに必要なディスク領域を判断する手順と同じです。詳細については、「インデックスに必要なディスク領域の決定」を参照してください。
パフォーマンスに関する注意点
クエリ オプティマイザでは、インデックス内ですべての必要な列のデータを見つけることができ、テーブルまたはクラスタ化インデックスへのアクセスが発生しないため、SELECT 操作のパフォーマンスが向上します。ただし、付加列が多すぎると、インデックスのメンテナンスが増加するため、基になるテーブルまたはインデックス付きビューに対する INSERT、UPDATE、または DELETE 操作を実行するのに必要な時間が長くなります。
例
A. クエリに対応する
次の例では、4 つの付加列を持つ Person.Address
テーブル上に非クラスタ化インデックスが作成されます。インデックス キー列は PostalCode
で、非キー列は AddressLine1, AddressLine2, City,
と StateProvinceID
です。
USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO
このクエリはインデックスで対応されます。
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO
B. インデックス サイズの制限を超える
次の例では、CREATE INDEX ステートメントの INCLUDE 句を使用して、一般的にキー列の最大サイズ制限の 900 バイトを超えることが予想される列にインデックスを設定しています。Production.ProductReview
テーブルには、ProductID``(int)
、ReviewerName``(nvarchar (50))
、および Comments (nvarchar (3850))
の列が含まれています。これらの列はクエリで頻繁に使用されますが、Comments
列はインデックス キー列として参加するには大きすぎます。ただし、INCLUDE
句を使用すると、Comments
列をインデックス内の非キー列として追加することができます。
USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_ProductReview_ProductID_ReviewerName
ON Production.ProductReview (ProductID, ReviewerName)
INCLUDE (Comments);
GO
このクエリはインデックスで対応されます。
SELECT Comments
FROM Production.ProductReview
WHERE ProductID = 937;
GO
付加列インデックスを作成するには
参照
概念
非クラスタ化インデックスの作成
インデックスの設計の全般的なガイドライン