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

Warum nicht einfach 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

Schreibe einen Kommentar