Database Reference
In-Depth Information
Problem sehr gravierend ist, kann man eventuell den Index um einige Spalten erweitern, um
die Tabellenzugriffe über die ROWID ganz zu meiden.
7.1.2
Verzögerte Invalidierung der Cursor
Aus welchem Grund zeigen die neu erstellten Optimizer-Statistiken ihre Wirkung erst ei-
nige Stunden später? In diesem Abschnitt klären wir das. Fragen wir zunächst Peter, ob er
eine Erklärung dieses Phänomens hat.
Leonid: „ Peter, hast Du beobachtet, dass ein Ausführungsplan sich nach der Aktualisie-
rung der Optimizer-Statistiken verändert hat?
Peter: „ Ja, das habe ich einige Male gesehen.
L.: „ Hast Du bemerkt, dass es nicht sofort nach dem automatischen Erstellen der neuen
Statistiken, sondern mit einer spürbaren Verzögerung passiert?
P.: „ Ja. Ich vermute, es passiert, weil die bestehenden relevanten Cursor nicht sofort invali-
diert werden und eine Zeitlang weiterhin benutzt werden.
L.: „ Könntest Du möglicherweise sagen, wie groß diese Verzögerung sein kann?
P.: „ Nein, das kann ich nicht.
L.: „ Ist Dir das Argument NO_INVALIDATE von Prozeduren zum Erstellen der Optimi-
zer-Statistiken aufgefallen?
P.: „ Ich kenne dieses Argument und habe ein paar Mal den Vorgabewert dieses Arguments
auf FALSE geändert, als ich die Optimizer-Statistiken manuell generiert habe.
L.: „ Der Vorgabewert dieses Arguments ist AUTO_INVALIDATE. Was bedeutet es?
P.: „ Oracle entscheidet selber, wann die relevanten Cursor zu invalidieren sind.
L.: „ Richtig. Dies passiert aber nicht früher, als der Wert des Parameters _ optimizer _ in -
validation _ period vorschreibt. Der Vorgabewert dieses Parameters beträgt 18.000 s oder 5 h.
Nach der Invalidierung der Cursor wird ein harter Parse Call beim nächsten Parsen gemacht
und ein neuer Cursor infolgedessen angelegt. In der View V$SQL_SHARED_CURSOR wird
der Wert ' Y ' in die Spalte ROLL_INVALID_MISMATCH als Entstehungsgrund für diesen
neuen Cursor eingetragen. Ich habe einen Test-Case vorbereitet, der demonstriert, wie die
Cursor nach dem Erstellen der Optimizer-Statistiken mit dem Argument NO_INVALIDA-
TE= > AUTO_INVALIDATE invalidiert werden. Zunächst wird der Parameter _ optimi -
zer _ invalidation _ period auf 20 s in diesem Test-Case gesetzt, damit die Invalidierung des
Cursors schnell erfolgt.
SQL> alter system set "_optimizer_invalidation_period"=20;
System altered.
L.: „ Danach werden die Optimizer-Statistiken für die Tabelle T1 generiert und die zu testende
SQL-Anweisung ausgeführt. Dabei wird der Cursor mit CHILD_NUMMER=0 erzeugt.
Search WWH ::




Custom Search