私が持っている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%が書き込みです。