[Oracle] Sinnvolles Anlegen von Indizes

Loki2

Erfahrenes Mitglied
Hallo

Nach welchen Kriterien sollte ich bei meiner Oracle Datenbank meine Indizes anlegen?
Ich habe z.B. ein Table mit 29 Spalten. Auf 10 davon suche ich sehr oft und sehr viel. Ist es dann sinnvoll auf alle diese 10 Felder einen Index zu legen? Spielt die Reihenfolge eine Rolle? Wie mache ich das am sinnvollsten?

Vielen Dank!

Gruß und so
Loki2
 
Generell kommt es mal drauf an welche Oracle Version du einsetzt und was für ein Applikationstyp drunter liegt, sprich ein OLTP oder DSS / DWH System. Bei der 9i und aufwärts kann der Optimizer z.B. einen kombinierten Index (mehrere Spalten) zur Suche benutzen, auch wenn das erste Feld des Indizes in der Abfrage fehlt. Das nennt man einen Skip Scan. Bei 8i muss die Suche bei einem kombinierten Index immmer die vorderen Felder des Index besitzen, das 8i nur einen Index Range Scan kann.

Es ist (zumindest in 8) schon wichtig in welcher Reihenfolge Felder eines kombinierten Indizes gewählt werden. Im Allgemeinen ist es gut die Felder mit der höchsten Kardinalität und der höchsten Suchhäufigkeit nach vorne zu stellen. Kardinalität bedeutet wieviel Ausprägungen es gibt. Gut wäre hier eine Ausprügung pro Zeile (Bsp: Rechnungsnummer als Primary Key). Eher schlecht wäre etwas wie Geschlecht (m/w).

9i und größer kann auch einzelne Indizes kombinieren, was flexiblere Suchanfragen ermöglicht. Manchmal kann es sogar Sinn machen für Attribute mit geringer Kardinalität auf Bitmap Indizes umzusteigen, wobei man hier sehr genau lesen muss was das für Nachteile mit sich bringt.

Das genaze ist ein sehr komplexes Thema und ein Kochrezept gibt es hierfür leider nicht. Eigentlich gibt es nur eine Möglichkeit die richtige Kombination aus Indizes herauszufinden: TESTEN. Einfach mal ein paar Indizes nach den paar Grundregeln anlegen und die häufigsten Suchanfragen mit EXPLAIN PLAN testen. Wenn bei ca. 90% aller Anfragen kein Full Tablescan auftritt, ist das schonmal ein sehr guter Weg. Aber Achtung: Zu viel Indizes reduzieren die Performance von INSERT, UPDATE und DELETE um ca. 30%!
 
Hallo

Erstmal vielen Dank für diese Ausführliche Antwort. Ich benutze übrigens eine Oracle 9i Datenbank.

Nach unzähligen Tests bin ich zu dem Entschluss gekommen das das anlegen von insgesamt drei indizes die meiste Geschwindigkeit bringt.

Ich habe also nicht einen Index der alle Felder beinhaltet auf den viel Gesucht wird sondern habe alle Felder auf drei indizes aufgeteilt. Möglichst so das die, die häufig in den Abfragen kombiniert werden auch zusammen in einem Index sind.
Das scheint wirklich einiges an Geschwindigkeit zu bringen.

Gruß und so
Loki2
 

Neue Beiträge

Zurück