別の質問をしたいのですが、単一の JOIN を高速化するためだけに、クラスター化インデックスを外部キー列に配置するのが賢明でしょうか? それはおそらく役に立ちますが、...価格で!
クラスター化インデックスは、すべての操作でテーブルを高速化します。はい!します。背景情報については、 Kim Tripp の優れたThe Clustered Index Debate continueを参照してください。彼女は、クラスター化インデックスの主な基準についても言及しています。
- 狭い
- 静的 (変化しない)
- 個性的
- 可能であれば:増え続ける
INT IDENTITY はこれを完全に満たしますが、GUID はそうではありません。詳細な背景情報については、主キーとしての GUIDを参照してください。
なぜ狭い?クラスター化キーは、同じテーブルのすべての非クラスター化インデックスのすべてのインデックス ページに追加されるため (必要に応じて、データ行を実際に検索できるようにするため)。クラスタリングキーに VARCHAR(200) を入れたくない....
なぜユニークなの?? 上記を参照してください。クラスタリング キーは、SQL Server がデータ行を一意に検索するために使用するアイテムおよびメカニズムです。一意である必要があります。一意でないクラスタリング キーを選択すると、SQL Server 自体が 4 バイトの一意識別子をキーに追加します。気をつけて!
これらが私の基準です。クラスター化キーを、狭く、安定した、一意の、できれば増え続ける列に配置してください。外部キー列がそれらと一致する場合-完璧です!
ただし、どのような状況でも、クラスター化キーをワイドまたは複合外部キーに配置することはありません。注意: クラスタリング キーの値は、そのテーブルのすべての非クラスタ化インデックス エントリに追加されます。クラスター化されていないインデックスが 10 個あり、テーブルに 100,000 行ある場合、これは 100 万エントリです。それが 4 バイトの整数か、200 バイトの VARCHAR - HUGE かによって、大きな違いが生じます。ディスク上だけでなく、サーバー メモリ内でも同様です。クラスタ化インデックスを何にするかについて、非常に慎重に検討してください。
SQL Server は一意識別子を追加する必要があるかもしれません - さらに悪いことになります。値が変更されると、SQL Server は多くの簿記と更新をあちこちで行う必要があります。
要するに:
- 外部キーにインデックスを付けることは間違いなく素晴らしいアイデアです - 常にそうしてください!
- それをクラスター化インデックスにすることには非常に注意を払います。まず、クラスター化されたインデックスは 1 つしか取得できないため、どの FK リレーションシップを選択しますか? また、クラスタリング キーを幅広で絶えず変化する列に配置しないでください。