Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Clustered vs. Non-Clustered

Der Unterschied zwischen einem geclusterten und einem nicht geclusterten Index besteht darin, dass der geclusterte Index die physische Reihenfolge der Zeilen in der Datenbank bestimmt . Mit anderen Worten:Anwenden des Clustered-Index auf PersonId bedeutet, dass die Zeilen physisch nach PersonId sortiert werden in der Tabelle, sodass eine Indexsuche direkt zur Zeile gehen kann (anstelle eines nicht geclusterten Index, der Sie zur Position der Zeile führen würde, was einen zusätzlichen Schritt hinzufügen würde).

Das heißt, es ist ungewöhnlich dass der Primärschlüssel nicht der gruppierte Index ist, aber nicht unerhört. Das Problem mit Ihrem Szenario ist eigentlich das Gegenteil von dem, was Sie annehmen:Sie wollen einzigartig Werte in einem gruppierten Index, keine Duplikate. Da der gruppierte Index die physische Reihenfolge der Zeile bestimmt, muss der Server, wenn sich der Index in einer nicht eindeutigen Spalte befindet, einen Hintergrundwert zu Zeilen hinzufügen, die einen doppelten Schlüsselwert haben (in Ihrem Fall alle Zeilen mit demselben PersonId ), sodass der kombinierte Wert (Schlüssel + Hintergrundwert) eindeutig ist.

Das einzige, was ich vorschlagen würde, ist nicht mit einem Ersatzschlüssel (Ihre CourtOrderId ) als Primärschlüssel, sondern verwenden Sie stattdessen einen zusammengesetzten Primärschlüssel der PersonId und einige andere eindeutig identifizierende Spalten oder Sätze von Spalten. Wenn dies jedoch nicht möglich (oder nicht praktikabel) ist, setzen Sie den Clustered-Index auf CourtOrderId .