クラスター化インデックスがない場合、テーブルはヒープとして編成されます。これは、挿入されるすべての行がテーブルの最後のデータ ページに追加されることを意味します。また、行が更新されると、更新されたデータが以前よりも大きい場合、行はテーブルの最後のデータ ページに移動されます。
クラスタ化インデックスを持たない方がよい場合
可能な限り高速な挿入が必要であるが、更新と読み取りの速度が犠牲になる可能性があるテーブルがある場合は、クラスター化されたインデックスがなくてもうまくいく可能性があります。1 つの例は、キューとして使用されていたテーブルがある場合です。たとえば、後で読み取られて別のテーブルに移動されるだけの多数の挿入があります。
クラスタ化インデックス
クラスター化インデックスは、クラスター化インデックスの列に基づいて、テーブル内のデータを編成します。たとえば、uniqueidentifier などの間違ったものにクラスターを作成すると、速度が低下する可能性があります (以下を参照)。
クラスター化インデックスが検索に最も一般的に使用される値にあり、それが一意であり、増加している限り、クラスター化インデックスから驚くべきパフォーマンス上の利点が得られます。たとえば、一般的に USER_ID に基づいてユーザー データを検索する USERS というテーブルがある場合、USER_ID でクラスタリングすると、これらすべての検索のパフォーマンスが向上します。これにより、データを取得するために読み取る必要があるデータ ページの数が減ります。
クラスター化インデックスにキーが多すぎると、速度が低下する可能性もあります。
クラスター化インデックスの一般的なルール:
varchar 列にクラスター化しないでください。
通常は、INT IDENTITY 列でのクラスタリングが最適です。
よく検索するものに集中します。
UniqueIdentifier でのクラスタリング
インデックスに一意の識別子を使用すると、自然な並べ替え順序がないため、非常に非効率的です。インデックスの B ツリー構造に基づいて、uniqueidentifiers を使用すると、非常に断片化されたインデックスになります。再構築または再編成した後でも、それらは依然として非常に断片化されています。そのため、インデックスが遅くなり、断片化のためにメモリとディスク上で非常に巨大になります。また、uniqueidentifier の挿入では、インデックスでページ分割が発生する可能性が高くなり、挿入が遅くなります。一般に、一意の識別子はインデックスにとって悪いニュースです。
概要
私の推奨事項は、本当に正当な理由 (キューとして機能するテーブル) がない限り、すべてのテーブルにクラスター化インデックスを配置することです。