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.
“