2010-03-09 12 views
7

Ich habe ein wenig gesucht und keine ähnliche Frage gesehen, also hier geht.Wie kann man wissen, wann Indizes verwendet werden und welcher Typ?

Woher wissen Sie, wann ein Index in eine Tabelle eingefügt werden soll? Wie entscheiden Sie, welche Spalten in den Index aufgenommen werden sollen? Wann sollte ein Clustered-Index verwendet werden?

Kann ein Index jemals die Leistung von select Aussagen verlangsamen? Wie viele Indizes sind zu viele und wie groß ist eine Tabelle, um von einem Index zu profitieren?

EDIT:

Was Spaltendatentypen? Ist es in Ordnung, einen Index für eine varchar oder datetime zu haben?

+0

"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

Antwort

3

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.

+1

+1 für die Feststellung, dass es ein fortlaufender Prozess ist und nicht etwas, was Sie nur einmal tun. –

+0

Eigentlich ist unsere DB sowohl Sql Server als auch Postgres .. Sie haben also ein bisschen zu spezifisch bei der Implementierung dort, aber ansonsten eine gute Erklärung. – Earlz

+0

Ja, da Oracle keine Clustering-Indizes als solche hat (sie verfügen über indexorganisierte Tabellen und B-Tree-Cluster), und ein Clustering-Index für DB2 für z/OS wird als Richtlinie für Clusterdaten verwendet, nicht jedoch für Law. Indizes können die Auswahl weiter verlangsamen, wenn der Optimierer die Kardinalität des Ergebnissatzes nicht gut beherrscht - ein vollständiger Scan ist möglicherweise weniger teuer als ein Indexzugriff. –

0

Dies ist wirklich eine sehr umstrittene Frage, obwohl ein guter Ausgangspunkt wäre, jede Spalte zu indizieren, die Ergebnisse filtern wird. dh. Wenn Sie Produkte häufig nach Verkaufspreisen gruppieren, indexieren Sie die Spalte sale_price der Produkttabelle, um die Scanzeiten für diese Abfrage usw. zu verbessern.

0

Wenn Sie basierend auf dem Wert in einer Spalte Abfragen durchführen, möchten Sie wahrscheinlich indexieren diese Spalte.

dh

SELECT a,b,c FROM MyTable WHERE x = 1 

Sie würden

Allgemeinen einen Index für X. will, muss ich hinzufügen, Indizes für Spalten, die häufig abgefragt werden, und ich füge hinzu Verbindung Indizes, wenn ich die Abfrage auf mehr als eine Säule.

Indizes beeinträchtigen die Leistung eines SELECT nicht, aber sie können INSERT (oder UPDATES) verlangsamen, wenn Sie zu viele Indexspalten pro Tabelle haben.

Als Faustregel gilt: Beginnen Sie mit dem Hinzufügen von Indizes, wenn Sie WHERE a = 123 (in diesem Fall ein Index für "a") sagen.

0

Sie sollten einen Index für Spalten verwenden, die Sie für die Auswahl und Reihenfolge verwenden - also die WHERE- und ORDER BY-Klauseln.

Indizes könnenselect Anweisungen verlangsamen, wenn es viele von ihnen gibt und Sie WHERE und ORDER BY für Spalten verwenden, die nicht indiziert wurden.

Wie für die Größe der Tabelle - mehrere tausend Zeilen und aufwärts würde beginnen, echte Vorteile für die Indexnutzung zu zeigen.

Allerdings gibt es automatisierte Tools, um dies zu tun, und SQL Server hat eine Database Tuning Advisor, die dabei helfen wird.

+0

der ITW heißt jetzt "Datenbank-Tuning-Advisor (DTA)" in SQL Server 2005 und bis –

+0

@ marc_s - Danke dafür. Antwort aktualisiert – Oded

1

Faustregel Primärschlüssel (implizierte und standardmäßig auf geclusterten) und jeder Fremdschlüsselspalte

Es gibt mehr, aber man konnte tun schlimmer als missing index DMVs SQL Server unter Verwendung eines

Ein Index kann sich verlangsamen SELECT, wenn der Optimierer eine schlechte Wahl trifft, und es ist möglich, zu viele zu haben. Zu viele werden Schreibvorgänge verlangsamen, aber es ist auch möglich, Indizes zu überlappen.

1

Antwort auf diejenigen, die ich kann ich würde sagen, dass jede Tabelle, egal wie klein, immer von mindestens einem Index profitieren wird, da es mindestens eine Möglichkeit gibt in denen Sie die Daten nachschlagen möchten; sonst warum speichern Sie es?

Eine allgemeine Regel zum Hinzufügen von Indizes wäre, wenn Sie Daten in der Tabelle mit einem bestimmten Feld oder einer Gruppe von Feldern suchen müssen.Dies führt dazu, dass viele Indizes zu viele Indizes sind. Im Allgemeinen sind die Indizes umso langsamer, je langsamer sie eingefügt und aktualisiert werden, da sie auch die Indizes ändern müssen, aber alles hängt davon ab, wie Sie Ihre Daten verwenden. Wenn Sie schnelle Inserts brauchen, dann verwenden Sie nicht zu viele. Wenn Sie Datenspeicher vom Typ "Nur Lesen" melden, können Sie mehrere davon haben, um alle Ihre Suchvorgänge zu beschleunigen.

Leider gibt es keine Regel, die Sie bei der Anzahl oder Art der zu verwendenden Indizes unterstützt, obwohl der Abfrageoptimierer der ausgewählten Datenbank Hinweise geben kann, die auf den von Ihnen ausgeführten Abfragen basieren.

Bei Clustered-Indizes handelt es sich um die Ace-Karte, die Sie nur einmal verwenden dürfen. Wählen Sie daher sorgfältig. Es lohnt sich, die Selektivität des Felds zu berechnen, das Sie aufsetzen wollen, da es verschwendet werden kann, um es auf etwas wie ein boolesches Feld (konstruiertes Beispiel) zu setzen, da die Selektivität der Daten sehr gering ist.

+0

@Tony "Sonst, warum speichern Sie es" Was ist in einem Systemprotokoll, in dem das Protokoll sehr oft (viele Male pro Minute) eingefügt wird, aber die Daten nur abgerufen werden, wenn etwas passiert, wo das Protokoll benötigt wird (wie in, einmal alle ein oder zwei Monate) – Earlz

+0

@Earlz: Ein guter Punkt, aber wenn Sie sich das Protokoll anschauen, wird Ihnen ein Index helfen, die Millionen von Zeilen zu durchsuchen, die die Protokolltabelle enthält. Ich kann sehen, dass ich mit dieser Aussage ein wenig übertrieben war :) – Tony

Verwandte Themen