Nun, die erste Frage ist einfach:
Wann sollte ein Clustered-Index verwendet werden?
Immer. Zeitraum. Bis auf wenige, seltene Randfälle. Ein gruppierter Index macht eine Tabelle für jede Operation schneller. JA! Es tut. Siehe Kim Tripps ausgezeichnete The Clustered Index Debate continues für Hintergrundinformationen.Sie erwähnt auch ihre Hauptkriterien für einen Clustered-Index:
- schmal
- statisch (ändert sich nie)
- einzigartige
- wenn überhaupt möglich: je
INT IDENTITY Erhöhung erfüllt diese perfekt - GUIDs nicht. Ausführliche Hintergrundinformationen finden Sie unter GUID's as Primary Key.
Warum schmal? Da der Clusterschlüssel zu jeder einzelnen Indexseite jedes nicht gruppierten Indexes in derselben Tabelle hinzugefügt wird (um bei Bedarf die Datenzeile nachschlagen zu können). Sie möchten VARCHAR (200) in Ihrem Clustering-Schlüssel nicht haben.
Warum einzigartig ?? Siehe oben - der Clusterschlüssel ist das Element und der Mechanismus, mit dem SQL Server eine Datenzeile eindeutig findet. Es muss einzigartig sein. Wenn Sie einen nicht eindeutigen Clusterschlüssel auswählen, fügt SQL Server selbst Ihren Schlüsseln einen 4-Byte-Eindeutigkeitsschlüssel hinzu. Sei vorsichtig!
Weiter: Nicht gruppierte Indizes. Grundsätzlich gibt es eine Regel: Jeder Fremdschlüssel in einer Kindtabelle, die auf eine andere Tabelle verweist, sollte indexiert werden, damit JOINs und andere Operationen beschleunigt werden.
Darüber hinaus sind alle Abfragen, die WHERE-Klauseln haben, ein guter Kandidat - wählen Sie die zuerst, die viel ausgeführt werden. Setzen Sie Indizes auf Spalten, die in WHERE-Klauseln in ORDER BY-Anweisungen angezeigt werden.
Als nächstes: Messen Sie Ihr System, überprüfen Sie die DMV (Dynamic Management Views) für Hinweise über ungenutzte oder fehlende Indizes, und optimieren Sie Ihr System immer und immer wieder. Es ist ein fortlaufender Prozess, du wirst nie fertig sein! Siehe here for info für diese beiden DMVs (fehlende und ungenutzte Indizes).
Noch ein Wort der Warnung: Mit einer LKW-Ladung von Indizes können Sie jede SELECT-Abfrage wirklich sehr schnell machen. Gleichzeitig können INSERTs, UPDATEs und DELETEs, die alle beteiligten Indizes aktualisieren müssen, darunter leiden. Wenn Sie nur SELECT - gehen Sie verrückt! Ansonsten ist es ein feiner und delikater Balanceakt. Sie können immer eine einzelne Abfrage über den Glauben hinaus optimieren - aber der Rest Ihres Systems könnte dabei leiden. Do not over-index Ihre Datenbank! Setzen Sie ein paar gute Indizes ein, überprüfen und beobachten Sie, wie sich das System verhält und fügen Sie dann noch ein oder zwei weitere hinzu: Beobachten Sie, wie die Gesamtleistung des Systems davon beeinflusst wird.
"Ist es in Ordnung, einen Index für ein Varchar oder Datetime zu haben?" Ich habe eine Tabelle, in der der gruppierte Index auf einer Datetime ist (obwohl wir nur den Datumsteil verwenden), da alle Abfragen in der Tabelle auf ein Start/Enddatum-Paar beschränkt sind und die Selektivität der Daten hoch genug ist es ist eine gute Wahl. – Tony