Wie die Unwirksamkeit einer SQL-Anweisung in Oracle-SQL-Bereich, so dass ein neuer plan erzeugt, wenn die Erhebung von Statistiken
Ich habe eine Tabelle und eine Abfrage (innerhalb einer PL/SQL-packge) Zugriff auf diese Tabelle. Statistiken werden wöchentlich in der Regel.
Einem großen update ausgeführt wurde, auf dem Tisch, was zu einer deutlich anderen Verteilung der Daten auf einen bestimmten indizierten Spalte. Der Abfrageplan verwendet, die von Oracle (was ich sehen kann von v$sqlarea
) ist sub-optimal. Wenn ich eine explain plan
auf der gleichen* Abfrage von SQL*Plus, ein guter plan wird zurückgegeben.
Habe ich da die gesammelten Statistiken auf den Tisch. Oracle ist immer noch mit der Abfrage-plan, der es ursprünglich kam mit. v$sqlarea.last_load_time
schlägt vor, dies war ein plan generiert, vor der Statistik-Erzeugung. Ich dachte, regenerierende Statistik hätte für ungültig erklärt Pläne in der SQL-cache.
Gibt es eine Möglichkeit zu entfernen, nur diese Anweisung aus der SQL-cache?
(* Nicht Zeichen für Zeichen, entspricht in der SQL-cache gleichen, aber die gleiche Aussage).
alter system flush shared_pool
und loszuwerden, alle Pläne?Konnte flush alles, aber es wäre loszuwerden, alle Pläne, Pakete, etc. das würde eine nachteilige Wirkung auf andere (wichtigere) Dinge. Die Sache ist langsam verschwunden, von 6 Sekunden bis ein paar Minuten, aber Sie läuft im hintergrund.
Die Spülung des gesamten gemeinsam genutzten pool ist massiver overkill hier. Sie würde Kraft Oracle zu re-analysieren alle SQL-Anweisungen, die derzeit im Cache gespeichert. Einführen konnte einige erhebliche performance-Probleme, wenn Sie hat es auf einem Produktionssystem.
Justin Höhle: Wenn man es nur einmal, die Menschen wahrscheinlich nicht einmal bemerken.
InformationsquelleAutor WW. | 2011-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie 10.2.0.4 oder höher, sollten Sie in der Lage sein, verwenden Sie das package DBMS_SHARED_POOL zu purge einen einzelnen cursor aus dem gemeinsamen pool.
InformationsquelleAutor Justin Cave
Fand ich heraus (bei der recherche etwas anderes), dass das, was ich getan haben sollte, war der Einsatz von
Bei der Erhebung der Statistik durch Aufruf
gather_table_stats
. Dies würde verursacht haben, alle SQL-Pläne verweisen auf die Tabelle sofort für ungültig erklärt werden.Den Oracle docs sagen:
Den Standardwert von
AUTO_INVALIDATE
zu verursachen scheint Ungültigkeitserklärung von SQL-Anweisungen innerhalb der nächsten 5 Stunden. Um zu verhindern, dass massive Anzahl von hard-analysiert, wenn Sie sammeln Statistiken über die Menge an Objekten.InformationsquelleAutor WW.