Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wähle und optimiere ich Oracle-Indizes?

Die Oracle-Dokumentation bietet eine Reihe hervorragender Überlegungen zur Indexierung:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

Update für 19c:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486- 2CBBFC2B7A1D

Zitat:

  • Erwägen Sie die Indizierung von Schlüsseln, die häufig in WHERE-Klauseln verwendet werden.

  • Erwägen Sie die Indizierung von Schlüsseln, die häufig zum Verknüpfen von Tabellen in SQL-Anweisungen verwendet werden. Weitere Informationen zum Optimieren von Joins finden Sie im Abschnitt „Verwenden von Hash-Clustern für die Leistung“.

  • Wählen Sie Indexschlüssel mit hoher Selektivität. Die Selektivität eines Indexes ist der Prozentsatz der Zeilen in einer Tabelle mit demselben Wert für den indizierten Schlüssel. Die Selektivität eines Index ist optimal, wenn wenige Zeilen den gleichen Wert haben. Hinweis:Oracle erstellt automatisch Indizes oder verwendet vorhandene Indizes für die Schlüssel und Ausdrücke von eindeutigen und Primärschlüsseln, die Sie mit Integritätsbedingungen definieren. Das Indizieren von Spalten mit geringer Selektivität kann hilfreich sein, wenn die Datenverteilung verzerrt ist, sodass ein oder zwei Werte häufig vorkommen seltener als andere Werte.

  • Verwenden Sie keine standardmäßigen B-Tree-Indizes für Schlüssel oder Ausdrücke mit wenigen eindeutigen Werten. Solche Schlüssel oder Ausdrücke haben normalerweise eine schlechte Selektivität und optimieren daher die Leistung nicht, es sei denn, die häufig ausgewählten Schlüsselwerte erscheinen weniger häufig als die anderen Schlüsselwerte. In solchen Fällen können Sie Bitmap-Indizes effektiv verwenden, es sei denn, der Index wird häufig geändert, wie in einer OLTP-Anwendung mit hoher Parallelität.

  • Indizieren Sie keine Spalten, die häufig geändert werden. UPDATE-Anweisungen, die indizierte Spalten ändern, und INSERT- und DELETE-Anweisungen, die indizierte Tabellen ändern, dauern länger, als wenn kein Index vorhanden wäre. Solche SQL-Anweisungen müssen sowohl Daten in Indizes als auch Daten in Tabellen ändern. Sie erzeugen auch zusätzliche Undo- und Redo-Operationen.

  • Indizieren Sie keine Schlüssel, die nur in WHERE-Klauseln mit Funktionen oder Operatoren vorkommen. Eine WHERE-Klausel, die eine andere Funktion als MIN oder MAX verwendet, oder ein Operator mit einem indizierten Schlüssel stellt den Zugriffspfad, der den Index verwendet, außer bei funktionsbasierten Indizes nicht zur Verfügung.

  • Erwägen Sie die Indizierung von Fremdschlüsseln mit referenziellen Integritätsbedingungen in Fällen, in denen eine große Anzahl gleichzeitiger INSERT-, UPDATE- und DELETE-Anweisungen auf die übergeordneten und untergeordneten Tabellen zugreifen. Ein solcher Index erlaubt UPDATEs und DELETEs in der Elterntabelle, ohne die Kindtabelle gemeinsam zu sperren.

  • Berücksichtigen Sie bei der Entscheidung, einen Schlüssel zu indizieren, ob der Leistungsgewinn für Abfragen den Leistungsverlust für INSERTs, UPDATEs und DELETEs und die Verwendung des zum Speichern des Index erforderlichen Speicherplatzes wert ist. Sie können experimentieren, indem Sie die Verarbeitungszeiten der SQL-Anweisungen mit und ohne Indizes vergleichen. Sie können die Verarbeitungszeit mit der SQL-Trace-Funktion messen.