Allgemeine Richtlinien zum Indexentwurf
Erfahrene Datenbankadministratoren sind in der Lage, einen geeigneten Satz an Indizes zu entwerfen. Es handelt sich jedoch selbst bei gemäßigt komplexen Datenbanken und Arbeitsauslastungen um eine sehr komplexe, zeitintensive und fehleranfällige Aufgabe. Das Verständnis der Merkmale der Datenbank, Abfragen und Datenspalten kann Sie beim Entwerfen optimaler Indizes unterstützen.
Überlegungen zu Datenbanken
Beachten Sie beim Entwerfen eines Indexes die folgenden Datenbankrichtlinien:
Eine große Anzahl an Indizes für eine Tabelle beeinträchtigt die Leistung der Anweisungen INSERT, UPDATE, DELETE und MERGE, da alle Indizes entsprechend angepasst werden müssen, sobald Daten in der Tabelle geändert werden.
Vermeiden Sie die zu starke Indizierung häufig aktualisierter Tabellen, und halten Sie die Indizes schmal, d. h., verwenden Sie so wenig Spalten wie möglich.
Verwenden Sie viele Indizes, um die Abfrageleistung für Tabellen zu verbessern, die geringe Aktualisierungsanforderungen und große Datenmengen aufweisen. Eine große Anzahl an Indizes kann die Leistung von Abfragen steigern, durch die keine Daten geändert werden (z. B. SELECT-Anweisungen), da der Abfrageoptimierer aus einer größeren Anzahl an Indizes auswählen kann, um die beste Methode für den schnellstmöglichen Zugriff zu ermitteln.
Das Indizieren kleiner Tabellen ist häufig nicht die optimale Methode, da der Abfrageoptimierer in diesem Fall mitunter mehr Zeit benötigt, um die Daten über einen Index zu suchen, als für die Durchführung eines einfachen Tabellenscans erforderlich wäre. Aus diesem Grund werden Indizes für kleine Tabellen möglicherweise niemals verwendet, müssen jedoch trotzdem verwaltet werden, wenn sich Daten in der Tabelle ändern.
Indizes für Sichten können zu erheblichen Leistungsverbesserungen führen, wenn die Sicht Aggregationen, Tabellenverknüpfungen oder eine Kombination aus Aggregationen und Verknüpfungen enthält. Es ist nicht erforderlich, dass in der Abfrage explizit auf die jeweilige Sicht verwiesen wird, damit der Abfrageoptimierer die Sicht verwendet. Weitere Informationen finden Sie unter Entwerfen von indizierten Sichten.
Verwenden Sie den Datenbankoptimierungsratgeber, um die Datenbank zu analysieren und Indexempfehlungen zu erhalten. Weitere Informationen finden Sie unter Grundlegendes zum Datenbankoptimierungsratgeber.
Überlegungen zu Abfragen
Beachten Sie beim Entwerfen eines Indexes die folgenden Abfragerichtlinien:
Erstellen Sie nicht gruppierte Indizes für alle Spalten, die häufig in Prädikaten und Verknüpfungsbedingungen in Abfragen verwendet werden.
Wichtig Vermeiden Sie es, nicht erforderliche Spalten hinzuzufügen. Wenn Sie zu viele Indexspalten hinzufügen, kann sich dies negativ auf den Speicherplatz und die Indexverwaltungsleistung auswirken.
Abdeckende Indizes können die Abfrageleistung steigern, weil alle Daten im Index selbst enthalten sind, die die Anforderungen der Abfrage erfüllen. Auf diese Weise muss nur auf die Indexseiten und nicht auf die Datenseiten der Tabelle oder des gruppierten Indexes verwiesen werden, um die abgefragten Daten abzurufen, wodurch der Umfang der E/A-Operationen des Datenträgers verringert wird. Eine Abfrage der Spalten a und b für eine Tabelle, die einen zusammengesetzten Index besitzt, der für die Spalten a, b und c erstellt wurde, kann die angegebenen Daten ausschließlich aus dem Index abrufen.
Schreiben Sie Abfragen, die möglichst viele Zeilen in einer einzigen Anweisung einfügen oder ändern, anstatt mehrere Abfragen zum Aktualisieren der gleichen Zeilen zu verwenden. Wenn nur eine Anweisung verwendet wird, kann der Index optimal verwaltet werden.
Werten Sie den Abfragetyp sowie die Art der Verwendung von Spalten in der Abfrage aus. Eine Spalte, die in einem Abfragetyp für genaue Übereinstimmung verwendet wird, ist z. B. ein guter Kandidat für einen nicht gruppierten oder gruppierten Index. Weitere Informationen finden Sie unter Abfragetypen und Indizes.
Überlegungen zu Spalten
Beachten Sie beim Entwerfen eines Indexes die folgenden Spaltenrichtlinien:
Wählen Sie für gruppierte Indizes einen kurzen Indexschlüssel aus. Gruppierte Indizes bieten darüber hinaus den Vorteil, dass sie für eindeutige oder Nicht-NULL-Spalten erstellt werden. Weitere Informationen finden Sie unter Richtlinien für den Entwurf gruppierter Indizes.
Spalten, die die ntext-, text-, image-, varchar(max)-, nvarchar(max)- und varbinary(max)-Datentypen verwenden, können nicht als Indexschlüsselspalten angegeben werden. varchar(max)-, nvarchar(max)-, varbinary(max)- und xml-Datentypen können jedoch als Nichtschlüssel-Indexspalten in einen nicht gruppierten Index aufgenommen werden. Weitere Informationen finden Sie unter Index mit eingeschlossenen Spalten.
Ein xml-Datentyp kann nur in einem XML-Index eine Schlüsselspalte sein. Weitere Informationen finden Sie unter Indizes für Spalten des Datentyps XML.
Überprüfen Sie die Eindeutigkeit der Spalten. Ein eindeutiger Index anstelle eines nicht eindeutigen Indexes für dieselbe Kombination von Spalten stellt zusätzliche Informationen für den Abfrageoptimierer bereit, die den Index wertvoller machen. Weitere Informationen finden Sie unter Richtlinien zum Entwerfen eindeutiger Indizes.
Überprüfen Sie die Datenverteilung in der Spalte. Häufig dauert eine Abfrage deshalb sehr lange, weil eine indizierte Spalte mit wenigen eindeutigen Werten verwendet wird oder weil sie eine Verknüpfung mit einer solchen Spalte durchführt. Hierbei handelt es sich um ein grundlegendes Problem von Daten und Abfragen, das in der Regel nicht gelöst werden kann, ohne die betreffende Situation zu identifizieren. Beispielsweise wird ein Telefonbuch, das alphabetisch nach dem Nachnamen sortiert ist, das Suchen eines Teilnehmers nicht vereinfachen, wenn alle Teilnehmer des Ortsnetzes Smith oder Jones heißen. Weitere Informationen zur Datenverteilung finden Sie unter Verwenden von Statistiken zum Verbessern der Abfrageleistung.
Verwenden Sie für Spalten mit fest definierten Teilmengen, z. B. Spalten mit geringer Dichte, Spalten, die größtenteils NULL-Werte enthalten, Spalten mit Wertekategorien und Spalten mit verschiedenen Wertebereichen, gefilterte Indizes. Ein gut entworfener gefilterter Index kann die Abfrageleistung verbessern, die Indexwartungskosten reduzieren und den Speicheraufwand verringern. Weitere Informationen finden Sie unter Richtlinien für den Entwurf gefilterter Indizes.
Berücksichtigen Sie die Reihenfolge der Spalten, wenn der Index mehrere Spalten enthalten soll. Die Spalte, die in der WHERE-Klausel in einer Gleich- (=), Größer als- (>), Kleiner als- (<) oder BETWEEN-Suchbedingung verwendet oder in eine Verknüpfung eingeschlossen wird, sollte an erster Stelle stehen. Die Reihenfolge zusätzlicher Spalten sollte basierend auf dem Grad ihrer Eindeutigkeit, d. h. von der eindeutigsten Spalte absteigend zu der am wenigsten eindeutigen Spalte, ausgewählt werden.
Wenn der Index z. B. als LastName, FirstName definiert ist, ist der Index hilfreich, wenn das Suchkriterium WHERE LastName = 'Smith' oder WHERE LastName = Smith AND FirstName LIKE 'J%' lautet. Der Abfrageoptimierer verwendet den Index jedoch nicht für eine Abfrage, die nur nach FirstName (WHERE FirstName = 'Jane') sucht.
Ziehen Sie das Indizieren berechneter Spalten in Betracht. Weitere Informationen finden Sie unter Erstellen von Indizes für berechnete Spalten.
Indexmerkmale
Wenn sich herausgestellt hat, dass ein Index für eine Abfrage geeignet ist, können Sie den Indextyp auswählen, der für die jeweilige Situation am besten geeignet ist. Die Indexmerkmale beziehen sich z. B. auf Folgendes:
Gruppiert im Vergleich zu nicht gruppiert
Eindeutig im Vergleich zu nicht eindeutig
Einspaltig im Vergleich zu mehrspaltig
Aufsteigende oder absteigende Reihenfolge in den Spalten des Indexes
Tabellenindizes im Vergleich zu gefilterten für nicht gruppierte Indizes
Um die Indexleistung- oder -wartung zu optimieren, können Sie durch das Festlegen einer Option wie z. B. FILLFACTOR auch die Ausgangsspeichermerkmale des Indexes anpassen. Weitere Informationen finden Sie unter Festlegen von Indexoptionen. Zudem können Sie den Speicherort des Indexes mithilfe von Dateigruppen oder Partitionsschemas festlegen, um die Leistung zu optimieren. Weitere Informationen finden Sie unter Platzieren von Indizes in Dateigruppen.
Siehe auch