Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Identifizieren von ASH-Sequenzkonflikten in RAC

In Kapitel 3 von Oracle RAC Performance Tuning habe ich gezeigt, wie falsche CACHE-Werte für Sequenzen zu schlechter Leistung in Oracle RAC führen können. Ich habe auch gezeigt, wie man Sequenzkonflikte erkennt, wenn man sich die Warteereignisse einer Sitzung ansieht.

Heute habe ich mit einem Entwickler zusammengearbeitet, der eine neue Sequenz erstellt hat. Der Entwickler hatte einen CACHE-Wert von 100, was mir zunächst einen zu niedrigen Wert gab. Ich habe diese niedrige Einstellung während der Codeüberprüfung entdeckt. Der Entwickler hält den CACHE-Wert für in Ordnung, aber ich bin nicht überzeugt. Wir werden dies unter Last testen, um zu sehen, ob der CACHE-Wert angepasst werden muss.

In der Zwischenzeit dachte ich:„Was ist, wenn ich das bei der Codeüberprüfung übersehen habe?“ Und eine Folgefrage:„Was wäre, wenn wir beim Lasttest nichts bemerkt hätten?“ Ich möchte in der Lage sein, zurückzugehen und zu bestimmen, welche Sequenzen, falls vorhanden, Kandidaten für eine falsche CACHE-Einstellung wären. Ich könnte sicherlich Sitzungen verfolgen und die Trace-Dateien analysieren, aber das wäre zu schmerzhaft. Also habe ich ein Skript entwickelt, das ich gegen den aktiven Sitzungsverlauf ausführen kann, um bei der Bestimmung von Kandidatensequenzen zu helfen.

select sh.sql_id,to_char(st.sql_text),count(*)
from dba_hist_active_sess_history sh
join dba_hist_sqltext st
 on sh.sql_id=st.sql_id
where st.sql_text like '%NEXTVAL%'
 and (event='row cache lock' or event like 'gc current block %-way')
group by sh.sql_id,to_char(st.sql_text)
order by count(*) desc;

Aufgrund der Natur der ASH-Sammlung ist dies keine perfekte Wissenschaft. Die Sitzung, bei der der Konflikt auftritt, müsste genau zum richtigen Zeitpunkt abgefangen werden, um in der Tabelle DBA_HIST_ACTIVE_SESSION_HISTORY zu sein. Aber die obige SQL-Anweisung gibt mir einige Kandidaten zur Prüfung. Nicht für jede Sequenz, auf die in den zurückgegebenen SQL-Anweisungen zugegriffen wird, müssen die CACHE-Werte angepasst werden. Weitere Analysen wären erforderlich. Dies gibt mir jedoch eine Liste von denen, die zu berücksichtigen sind. Und es kann helfen, meine ersten Fragen zu beantworten. Wenn ich die Sequenzerstellung während der Codeüberprüfung verpasst habe, kann ich sie hoffentlich später finden, wenn die Sequenz ein Problem für die Anwendungsleistung darstellt.