Ich habe eine SQL Server 2014- Tabelle, die wie folgt aussieht:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Einige Leute in meinem Team haben vorgeschlagen, dass der Clustered-Index aktiviert sein sollte OrderId
, aber ich denke, dass das CustomerId
+ OrderId
aus folgenden Gründen eine bessere Wahl wäre:
- Fast alle Anfragen werden gesucht
WHERE CustomerId = @param
, nichtOrderId
CustomerId
ist ein Fremdschlüssel für dieCustomer
Tabelle, daher sollte ein Clustered-Index mit dieCustomerId
Verknüpfungen beschleunigen- Obwohl dies
CustomerId
nicht eindeutig ist, wird durch dieOrderId
Angabe der zusätzlichen Spalte im Index die Eindeutigkeit sichergestellt. (Wir können dasUNIQUE
Schlüsselwort beim Erstellen des Clustered-Index für diese beiden Spalten verwenden, um den Aufwand zu vermeiden, dass keine Eindeutigkeit vorliegt.) - Sobald Daten eingefügt wurden, ändern sich die
CustomerId
undOrderId
nie mehr, sodass sich diese Zeilen nach dem ersten Schreiben nicht mehr bewegen. - Der Datenzugriff erfolgt über ein ORM, das standardmäßig alle Spalten anfordert. Wenn also eine Abfrage basierend auf
CustomerId
eingeht, kann der Clustered-Index alle Spalten ohne zusätzliche Arbeit bereitstellen.
Klingt der CustomerId
und OrderId
-Ansatz nach der oben genannten Option am besten? Oder ist es OrderId
für sich genommen besser, da es sich um eine einzelne Spalte handelt, die die Einzigartigkeit von sich aus garantiert?
Derzeit hat die Tabelle einen Clustered-Index OrderId
und einen nicht-Clustered-Index CustomerId
, der jedoch nicht behandelt wird. Da wir also ein ORM verwenden und alle Spalten angefordert werden, ist es zusätzliche Arbeit, sie abzurufen. Mit diesem Beitrag versuche ich, die Leistung mit einem besseren CI zu verbessern.
Die Aktivität in unserer Datenbank beträgt ca. 85% Lese- und 15% Schreibvorgänge.