Database Reference
In-Depth Information
Bei dem Einsetzen der Reverse Key Indices muss man aufpassen, da diese Indices nicht
universell sind: mit diesen Indices sind keine Index Range Scans möglich.
3.2.3.7.4 TM - Enqueue
Das TM-Enqueue (oder DML-Lock) benutzt Oracle bei mehreren Operationen. Der
Zweck dieses Enqueue ist es, zu gewährleisten, dass die jeweilige Tabelle während der Aus-
führung von DML-Kommandos nicht gelöscht wird. Die häufigste Ursache für das Warten
auf dieses Warteereignis sind die fehlenden Indices für Foreign Key Constraints. Mit dem
Skript missing_fk_idx.sql kann man solche Constraints ohne Indices ermitteln. Die Spalte
ROW_WAIT_OBJ# der View V$SESSION enthält die Nummer des Objektes, auf welches
beim Warteereignis „TM - enqueue“ gewartet wird. Mit dieser Objektnummer kann man
den jeweiligen Objektnamen in der View DBA_OBJECTS finden. Danach kann man in
der Ausgabe des Skripts missing_fk_idx.sql prüfen, ob bei diesem Objekt (sprich bei der
Tabelle) irgendwelche Indices für Foreign Key Constraints fehlen. Das Anlegen der fehlen-
den Indices beseitigt das Warten auf „TM - enqueue“.
Wenn es also zu den Wartezuständen für „TM - enqueue“ bei DML-Kommandos wegen
der fehlenden Indices kommt, sind die Analyse und die Beseitigung des Problems ziem-
lich einfach. Ein paar Mal hatte ich aber mit Performanz-Problemen wegen der fehlenden
Indices für Foreign Keys zu tun, bei denen keine Wartezustände für „TM - enqueue“ zu
beobachten waren. Diese Probleme waren etwas komplizierter für die Analyse.
P.: „Wodurch kann solch ein Performanz-Problem entstehen?“
L.: „Wenn ein Foreign Key die Klausel ‚ON DELETE CASCADE' hat, muss Oracle die
jeweiligen Daten in den Detail-Tabellen beim Löschen der Daten in der Master-Tabelle ent-
fernen. Bei einem fehlenden Index auf der Detail-Tabelle ist es lediglich mit dem Full Table
Scan möglich, der für jeden Satz der Master-Tabelle ausgeführt wird. Ähnlich sieht es mit der
Klausel ‚ON DELETE SET NULL' aus. Ohne Klausel ‚ON DELETE' wird mit Full Table Scan
auf der Detail-Tabelle geprüft, ob ein Satz in der Master-Tabelle gelöscht werden kann.“
P.: „Du sagtest, dass solche Fälle für die Analyse schwierig sind. Warum?“
L.: „Stelle Dir vor, dass eine lange Kette der Foreign Key Constraints die Master- und die
Detail-Tabelle miteinander verbindet. Und irgendwo am Ende dieser Kette ein Index fehlt.
Das ist ziemlich mühsam manuell zu ermitteln. Der Fall ohne Klausel ‚ON DELETE' stellt
übrigens kein besonderes Problem für die Analyse dar, weil Oracle nicht die ganzen Ketten
der Foreign Key Constraints, sondern nur die nächsten Detail-Tabellen überprüft.“
P.: „Man kann doch alle fehlenden Indices anlegen, die man mit dem Skript missing_fk_
idx.sql ermittelt, um solche Probleme zu beheben.“
L.: „Wenn dieses Skript sehr viele Indices findet, kann es problematisch sein. Nachdem ich
ein paar aufwendige Analysen durchgeführt habe, habe ich entschieden, die nächste Analyse
lieber mit einem Skript zu machen. So entstand das Skript missing_fk_idx_for_table.sql.“
P.: „Was macht dieses Skript?“
L.: „Wenn ein Delete-Kommando zu lange dauert und der Verdacht besteht, dass es wegen
der fehlenden Indices passiert, kann man das mit diesem Skript sofort prüfen. Das Skript
Search WWH ::




Custom Search