Das hängt davon ab, was Sie mit "gut" und "schlecht" meinen. Grundsätzlich müssen Sie wissen, dass jeder hinzugefügte Index die Leistung bei jeder Suche nach dieser Spalte erhöht (also das Hinzufügen eines Indexes zur Spalte "Nachname" einer Personentabelle erhöht die Leistung bei Abfragen mit "where lastname=" in ihnen) Schreibleistung über die gesamte Tabelle verringern.
Der Grund dafür ist, dass Sie beim Hinzufügen oder Aktualisieren einer Zeile sowohl die Tabelle selbst als auch jeden Index, dem die Zeile angehört, hinzufügen oder aktualisieren müssen. Wenn Sie also fünf Indizes für eine Tabelle haben, muss jede Addition an sechs Stellen schreiben - fünf Indizes und die Tabelle - und ein Update kann im schlimmsten Fall bis zu sechs Stellen umfassen.
Die Indexerstellung ist ein Balanceakt zwischen Abfragegeschwindigkeit und Schreibgeschwindigkeit. In manchen Fällen, wie zum Beispiel bei Datamarts, die nur einmal pro Woche in einem Übernachtjob mit Daten geladen werden, aber tausende Male täglich abgefragt werden, ist es sehr sinnvoll, Indizes zu überladen und die Abfragen so schnell wie möglich zu beschleunigen. Im Fall von Online-Transaktionsverarbeitungssystemen möchten Sie jedoch versuchen, ein Gleichgewicht zwischen ihnen zu finden.
Kurz gesagt, fügen Sie Indizes zu Spalten hinzu, die in ausgewählten Abfragen häufig verwendet werden. Versuchen Sie jedoch, zu viele hinzuzufü- gen, und fügen Sie zuerst die am häufigsten verwendeten Spalten hinzu.
Danach ist es eine Belastungsprobe, um zu sehen, wie die Leistung unter Produktionsbedingungen reagiert, und eine Menge Optimierungen, um eine akzeptable Balance zu finden.
Felder, die verschieden, hochspezifisch oder eindeutig sind, ergeben gute Indizes. Wie Datums- und Zeitstempel, eindeutige fortlaufende Nummern (häufig als Primärschlüssel verwendet), Personennamen, Nummernschildnummern, etc ...
Ein Gegenbeispiel wäre das Geschlecht - es gibt nur zwei gemeinsame Werte, so dass der Index nicht wirklich hilft, die Anzahl der Zeilen zu reduzieren, die gescannt werden müssen.
Beschreibende Freiformzeichenfolgen in voller Länge erzeugen schlechte Indizes, da derjenige, der die Abfrage ausführt, selten den genauen Wert der Zeichenfolge kennt.
Linear geordnete Daten (z. B. Zeitstempel oder Daten) werden häufig als gruppierter Index verwendet, wodurch die Zeilen in der Indexreihenfolge gespeichert werden und der Zugriff in der Reihenfolge ermöglicht wird. Bereichsabfragen werden erheblich beschleunigt (z. B. "Gib mir alles die Kundenaufträge zwischen Oktober und Dezember '). In einem solchen Fall kann die DB-Engine einfach zu dem ersten Datensatz suchen, der durch den Bereich spezifiziert ist, und beginnt sequentiell zu lesen, bis sie den letzten erreicht.
Hier ist ein großartiger SQL Server-Artikel: Ссылка
Obwohl die Mechaniken bei Oracle nicht funktionieren, sind die Tipps sehr passend (abzüglich der Sache bei Clustered-Indizes, die in Oracle nicht ganz so funktionieren).
@Infamous Cow - Sie müssen an Primärschlüssel denken, nicht an Indizes.
@Xenph Yan - Etwas, das andere nicht angetastet haben, ist die Auswahl des zu erstellenden Typs des Indexes. Einige Datenbanken bieten Ihnen nicht wirklich eine Auswahl, aber einige haben eine große Auswahl an möglichen Indizes. B-Bäume sind der Standard , aber nicht immer der beste Index. Die Wahl der richtigen Struktur hängt von der Art der Nutzung ab, die Sie erwarten. Welche Art von Anfragen müssen Sie am meisten unterstützen? Befindest du dich in einer Umgebung mit Lese- oder Schreibrechten? Werden Ihre Schreibvorgänge von Aktualisierungen oder Anhängen dominiert? Usw. usw.
Eine Beschreibung der verschiedenen Arten von Indizes und ihrer Vor- und Nachteile finden Sie hier: Ссылка .
Einige Faustregeln, wenn Sie versuchen, eine bestimmte Abfrage zu verbessern.
Versuchen Sie für eine bestimmte Tabelle (in der Sie denken, dass Oracle starten sollte), jede der in der WHERE-Klausel verwendeten Spalten zu indizieren. Setzen Sie Spalten mit Gleichheit zuerst, gefolgt von Spalten mit einem Bereich oder ähnlich.
Zum Beispiel:
%Vor%Wenn Spalten sehr groß sind (z. B. wenn Sie XML oder etwas anderes speichern), sollten Sie sie besser aus dem Index entfernen. Dadurch wird der Index zum Scannen kleiner, vorausgesetzt, Sie müssen trotzdem in die Tabellenzeile gehen, um die Auswahlliste zu erfüllen.
Wenn alle Werte in den SELECT- und WHERE-Klauseln im Index enthalten sind, muss Oracle nicht auf die Tabellenzeile zugreifen. Daher ist es manchmal eine gute Idee, die ausgewählten Werte zuletzt in den Index zu schreiben und einen Tabellenzugriff zu vermeiden.
Sie könnten ein Buch über die besten Möglichkeiten zum Indexieren schreiben - suchen Sie nach Autor Jonathan Lewis.
Ein guter Index ist etwas, auf das Sie sich verlassen können, um für eine bestimmte Tabellenzeile eindeutig zu sein.
Ein häufig verwendetes Indexschema ist die Verwendung von Zahlen, die für jede Zeile in der Tabelle um 1 erhöht werden. Jede Zeile hat am Ende einen anderen Zahlenindex.