私が持っているSQL Serverの2014台をその次のようになります。
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
私のチームの一部の人々は、クラスター化インデックスをオンOrderId
にすることを提案しましたが、次の理由から、CustomerId
+のOrderId
方が適切な選択だと思います。
- ほとんどすべてのクエリは
WHERE CustomerId = @param
、ではなく、OrderId
CustomerId
はCustomer
テーブルへの外部キーなので、CustomerId
結合を高速化する必要があるクラスタ化インデックスを持つ- 一方で
CustomerId
一意ではない、追加の持つOrderId
インデックスで指定した列は、(我々が使用できる一意性を保証するUNIQUE
ものを2列にクラスタ化インデックスを作成するときに一意性を持っていないのオーバーヘッドを回避するために、キーワードを) - データが挿入されると、
CustomerId
そしてOrderId
決して変更、これらの行は、最初の書き込みの後に動き回ることはないので。 - データアクセスは、デフォルトですべての列を要求するORMを介して行われるため、に基づくクエリが着信
CustomerId
すると、クラスター化インデックスは追加の作業なしですべての列を提供できます。
んCustomerId
とOrderId
最良の選択肢のようなアプローチの音は、上記に与えられましたか?それとも、OrderId
それ自体が一意性を保証する単一の列であるため、それ自体が優れていますか?
現在、テーブルにはにクラスター化インデックスがOrderId
あり、非クラスター化インデックスがにありますが、CustomerId
カバーしていません。そのため、ORMを使用しており、すべての列が要求されているため、それらを取得するのは追加の作業です。したがって、この投稿では、CIを改善してパフォーマンスを向上させることを検討しています。
DBでのアクティビティは、約85%が読み取り、15%が書き込みです。