Meine SQL-Kenntnisse auf niedrigerer Ebene (Server 2008) sind begrenzt und werden jetzt von unseren Datenbankadministratoren gefordert. Lassen Sie mich das Szenario erklären (ich habe offensichtliche Aussagen in der Hoffnung erwähnt, dass ich Recht habe, aber wenn Sie etwas falsch sehen, sagen Sie es mir bitte):
Wir haben einen Tisch, der 'Gerichtsbeschlüsse' für Menschen enthält. Als ich die Tabelle (Name: CourtOrder) erstellt habe, habe ich sie wie folgt erstellt:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
Ich habe dann einen nicht gruppierten Index auf den Primärschlüssel angewendet (aus Effizienzgründen). Meine Gründe sind, dass es sich um ein eindeutiges Feld (Primärschlüssel) handelt und wie häufig indiziert werden sollte, hauptsächlich zu AuswahlzweckenSelect from table where primary key = ...
Ich habe dann einen CLUSTERED-Index auf PersonId angewendet. Der Grund war, Bestellungen für eine bestimmte Person physisch zu gruppieren, da die überwiegende Mehrheit der Arbeit darin besteht, Bestellungen für eine Person zu erhalten. So,select from mytable where personId = ...
Ich bin jetzt darüber aufgezogen worden. Mir wurde gesagt, dass wir den Clustered-Index auf den Primärschlüssel und den normalen Index auf die personId setzen sollen. Das kommt mir sehr seltsam vor. Warum sollten Sie zunächst einen Clustered-Index für eine eindeutige Spalte erstellen? Was ist es Clustering? Sicher ist das eine Verschwendung des Clustered-Index? Ich hätte geglaubt, dass ein normaler Index für eine eindeutige Spalte verwendet wird. Das Clustering des Index würde auch bedeuten, dass wir keine andere Spalte gruppieren können (eine pro Tabelle, richtig?).
Der Grund dafür, dass mir mitgeteilt wurde, dass ich einen Fehler gemacht habe, ist, dass sie glauben, dass das Einfügen eines Clustered-Index in die PersonId das Einfügen verlangsamen würde. Für den Geschwindigkeitszuwachs von 5% einer Auswahl würden wir eine 95% ige Geschwindigkeitsverschlechterung bei Einfügungen und Aktualisierungen erhalten. Ist das richtig und gültig?
Sie sagen, dass SQL Server, da wir die personId gruppieren, Daten neu anordnen muss, wenn wir die PersonId einfügen oder ändern.
Dann habe ich gefragt, warum SQL das Konzept eines CLUSTERED INDEX haben sollte, wenn es so langsam ist. Ist es so langsam wie sie sagen? Wie sollte ich meine Indizes einrichten, um eine optimale Leistung zu erzielen? Ich hätte gedacht, dass SELECT mehr als INSERT verwendet wird ... aber sie sagen, dass wir Probleme beim Sperren von INSERTS haben ...
Hoffe jemand kann mir helfen.