クラスタ化インデックスの設計ガイドライン

クラスタ化インデックスは、データ行をそのキー値に基づいて並べ替え、テーブル内に格納します。データ行自体は 1 つの順序でしか並べ替えられないため、1 つのテーブルに設定できるクラスタ化インデックスは 1 つだけです。クラスタ化インデックスのアーキテクチャの詳細については、「クラスタ化インデックスの構造」を参照してください。

ほとんどの場合、各テーブルには、次の条件を満たす単一または複数の列に基づいて定義されたクラスタ化インデックスを作成することをお勧めします。

  • 頻繁に使用されるクエリに使用可能。

  • 一意性が高い。

    注意

    PRIMARY KEY 制約を作成すると、単一または複数の列に基づく一意のインデックスが自動的に作成されます。既定では、クラスタ化インデックスが作成されますが、制約を作成する際に非クラスタ化インデックスを作成するように指定することもできます。

  • 範囲クエリで使用可能。

UNIQUE プロパティを指定せずにクラスタ化インデックスが作成された場合、データベース エンジンにより、4 バイトの uniqueifier 列が自動的にテーブルに追加されます。必要があれば、各キーを一意にするため、データベース エンジンにより自動的に uniqueifier 値が行に追加されます。この列とその値は、内部的に使用されるもので、ユーザーが参照したりアクセスすることはできません。

クエリに関する注意点

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

  • BETWEEN、>、>=、<、および <= などの演算子を使用して、ある範囲の値を返す。

    クラスタ化インデックスを使用して最初の値を持つ行が検索されると、後続のインデックス値がある行は物理的に必ず隣接しています。たとえば、クエリである範囲内の販売注文番号を持つ行を取得する場合、SalesOrderNumber 列のクラスタ化インデックスを使用すると、最初の販売注文番号を含む行をすばやく検索して、最後の販売注文番号に達するまでテーブル内の後続の行をすべて取得できます。

  • 大きな結果セットを返す。

  • JOIN 句を使用する。通常、これらは外部キー列になります。

  • ORDER BY 句または GROUP BY 句を使用する。

    ORDER BY 句または GROUP BY 句の中で指定された列にインデックスが設定されている場合、行が既に並べ替えられているので、データベース エンジンによるデータの並べ替えが必要ないことがあります。このような場合は、クエリ パフォーマンスが向上します。

列に関する注意点

通常は、クラスタ化インデックス キーの定義に使用する列はできるだけ少なくする必要があります。次の 1 つ以上の条件を満たす列を使用するようにしてください。

  • 一意な値または多数の異なる値を含む。

    たとえば、従業員 ID は、従業員を一意に識別します。EmployeeID 列にクラスタ化インデックスまたは PRIMARY KEY 制約を設定すると、従業員 ID 番号に基づいて従業員情報を検索するクエリのパフォーマンスが向上します。また、LastNameFirstNameMiddleName 列を基にクラスタ化インデックスを作成することもできます。従業員レコードは、これらの列でグループ化されたりクエリが実行されることが多く、これらの列を組み合わせると多数の異なる値が含まれることになります。

  • 順次アクセスされる。

    たとえば、プロダクト ID は、AdventureWorks2008R2 データベースの Production.Product テーブルにある製品を一意に識別します。WHERE ProductID BETWEEN 980 and 999 など、順次検索が指定されているクエリでは、ProductID 列に基づくクラスタ化インデックスによりパフォーマンスが向上する場合があります。これは、行がこのキー列を基に並べ替えて格納されている場合があるためです。

  • テーブル内で一意であることが確実なため、IDENTITY として定義されている。

  • テーブルから取得したデータの並べ替えに頻繁に使用される。

    このような列を基にテーブルをクラスタ化する (つまり、物理的に並べ替える) と、この列に対してクエリを実行するたびに並べ替えにかかるコストを節約できるため便利です。

次のような場合は、クラスタ化インデックスの使用は適していません。

  • 頻繁に変更される列

    データベース エンジンでは各行のデータ値を物理的な順序で維持する必要があるので、データが変更されると行全体が移動します。データが頻繁に変更される大規模トランザクション処理システムでは、特にこの点に留意してください。

  • 広範なキー

    広範なキーは、複数の列または複数のサイズの大きな列を組み合わせたものです。クラスタ化インデックスのキー値は、すべての非クラスタ化インデックスにより、参照キーとして使用されます。非クラスタ化インデックスのエントリには、クラスタ化キー以外に、非クラスタ化インデックスのキー列も格納されるため、同じテーブルに非クラスタ化インデックスが定義されている場合は、サイズがかなり大きくなります。

インデックス オプション

クラスタ化インデックスを作成するときに、いくつかのインデックス オプションを指定できます。クラスタ化インデックスは、サイズがかなり大きくなることが多いため、次のオプションを使用する際には特に注意する必要があります。

  • SORT_IN_TEMPDB

  • DROP_EXISTING

  • FILLFACTOR

  • ONLINE

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