Das Hinzufügen eines Clustered-Indexes für einen Schlüssel, auf dem bereits ein Primärschlüssel vorhanden ist, ist eine unnötige Duplizierung. Stattdessen sollte der Primärschlüssel-Constrain auch der Clustered-Index sein. Ihre Frage ist jedoch tatsächlich anders ...
ist die CustomerId-Spalte ein geeigneter Kandidat für einen Clustered-Index?
Man kann dies nicht ohne zu wissen, beantworten, wie Sie die Tabelle Abfrage wird. Es gibt zahlreiche Abfragemuster, für die diese Organisation nicht optimal sein wird (typische Beispiele sind Zeitreihen, in denen die Zeitspalte der geeignete gruppierte Schlüssel ist). Und es gibt ebenso viele Beispiele für Abfragen, für die der beste Clustered-Index ist. Unbeantwortbar.
Da das ID-Feld der Primärschlüssel ist, muss SQL Server den Clustered-Index noch "einstufen"?
Wenn der Index nicht erklärt einzigartig dann wird SQL Server die uniquifier Spalte hinzuzufügen. Die Spalte Wert wird sich jedoch niemals materialisieren, da keine Duplikate auftreten werden.
Ich habe eine ‚Nachrichten‘ Tabelle, die in einer Chat-Anwendung verwendet wird ... WHERE CustomerId = @Id
... das ID-Feld ist der Primärschlüssel
Pardon, aber das macht nichts Sinn. Was Sie sagen, ist, dass die Messages
Tabelle nur eine Nachricht von jedem Kunden haben kann. Das würde eine schreckliche Chat-Erfahrung machen. Ich bin mir ziemlich sicher, dass deine Erklärung falsch ist.
Ich würde eine Customers
Tabelle mit Clustered-Index und Primärschlüssel Einschränkung auf CustomerId
erwarten. Die Messages
Tabelle wird wahrscheinlich durch Chat-Raum oder eine andere Gruppe Organisation, der Paare, die Chat-Teilnehmer zu organisieren. Wenn die Chats immer zwischen einem und genau einem Kunden und einem Vertreter sind, dann kann der "Chatraum" der Kunde selbst sein. In jedem Fall würde die typische Abfrage einer solchen Messages
Tabelle alle Nachrichten in einem Chat-Raum ausgetauscht werden, in der Reihenfolge oder alle Nachrichten ausgetauscht mit einem Kunden, in der Reihenfolge. Dies ist tatsächlich eine partitionierte Zeitreihe und wird am besten von einem gruppierten Index wie (chat_id, post_time)
oder (customer_id, post_time)
bedient. Beachten Sie, dass dieser nicht der Primärschlüssel ist, kann die Tabelle auch einen message_id
als Primärschlüssel, aber nicht gruppiert.
@GordonLinoff macht einen wichtigen Punkt, der ein Clustered-Schlüssel wie '(chat_id, post_time)' zu einer Fragmentierung führt als Daten an mehreren Punkten in dem Index eingefügt wird, aber in meiner Erfahrung, * wenn * es ein Problem wird, ist lösbar mit einfachem Reorganisieren oder Neuaufbau (eventuell mit einem niedrigen Füllfaktor). Wenn Sie stattdessen einen Clustered-Index auswählen, der nur die Semantik von Append-at-End-Semantik für die physische Organisation gewährleistet und Abfragen im Prozess benachteiligt, ist dies in der Regel weitaus schlechter. –
'@Id' sollte die Kundennummer sein, wenn ein Argument in eine gespeicherte Prozedur übergeben wird. So würden Sie alle Nachrichten für einen Kunden nach ihrer ID suchen. Es war ein schlecht geschriebenes Beispiel. Ja, in diesem Fall ist die "Kunden-ID" im Grunde die Chatroom-Kennung. –