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+ OrderIdaus folgenden Gründen eine bessere Wahl wäre:
- Fast alle Anfragen werden gesucht
WHERE CustomerId = @param, nichtOrderId CustomerIdist ein Fremdschlüssel für dieCustomerTabelle, daher sollte ein Clustered-Index mit dieCustomerIdVerknüpfungen beschleunigen- Obwohl dies
CustomerIdnicht eindeutig ist, wird durch dieOrderIdAngabe der zusätzlichen Spalte im Index die Eindeutigkeit sichergestellt. (Wir können dasUNIQUESchlü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
CustomerIdundOrderIdnie 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
CustomerIdeingeht, kann der Clustered-Index alle Spalten ohne zusätzliche Arbeit bereitstellen.
Klingt der CustomerIdund OrderId-Ansatz nach der oben genannten Option am besten? Oder ist es OrderIdfü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 OrderIdund 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.