Ich arbeite mit SQL Server, aber ich muss zu einer Anwendung mit einer Oracle-Datenbank migrieren. Um meine Anfragen zu verfolgen, benutze ich beim SQL Server das wunderbare Profiler-Tool. Gibt es etwas Ähnliches für Oracle?
Antworten
Zu viele Anzeigen?Weil ich gerade eine kürzliche Frage als Duplikat markiert und in diese Richtung verwiesen habe . . .
Noch ein paar - in SQL*Plus - SET AUTOTRACE ON - gibt Erklärungsplan und Statistiken für jede ausgeführte Anweisung.
TOAD ermöglicht auch das Client-seitige Profiling.
Der Nachteil von beiden ist, dass sie dir nur den Ausführungsplan für die Anweisung mitteilen, aber nicht, wie der Optimierer zu diesem Plan gekommen ist - dafür benötigst du serverseitiges Tracing auf niedrigerer Ebene.
Ein weiterer wichtiger Punkt zu verstehen sind Statspack-Snapshots - sie sind eine gute Möglichkeit, die Leistung der Datenbank als Ganzes zu betrachten. Der Erklärungsplan usw. sind gut geeignet, um einzelne SQL-Anweisungen zu finden, die Engpässe darstellen. Statspack ist gut darin zu identifizieren, dass dein Problem darin besteht, dass eine einfache Anweisung mit einem guten Ausführungsplan innerhalb einer Minute 1 Million Mal aufgerufen wird.
Der Trick besteht darin, alle SQL-Anweisungen zwischen zwei Zeitpunkten zu erfassen. Ähnlich wie es auch SQL Server tut.
Es gibt Situationen, in denen es nützlich ist, das SQL zu erfassen, das ein bestimmter Benutzer in der Datenbank ausführt. Normalerweise würden Sie einfach die Sitzungsverfolgung für diesen Benutzer aktivieren, aber es gibt zwei potenzielle Probleme bei diesem Ansatz.
- Das erste ist, dass viele webbasierte Anwendungen einen Pool persistenter Datenbankverbindungen pflegen, die von mehreren Benutzern gemeinsam genutzt werden.
- Das zweite ist, dass einige Anwendungen sehr schnell eine Verbindung herstellen, einige SQL-Befehle ausführen und sich wieder trennen, was es schwierig macht, die Sitzungsverfolgung überhaupt zu aktivieren (Sie könnten natürlich einen Logon-Trigger verwenden, um die Sitzungsverfolgung in diesem Fall zu aktivieren).
Ein schneller und einfacher Lösungsansatz für das Problem besteht darin, alle SQL-Anweisungen zu erfassen, die zwischen zwei Zeitpunkten ausgeführt werden.
Das folgende Verfahren erstellt zwei Tabellen, von denen jede einen Schnappschuss der Datenbank zu einem bestimmten Zeitpunkt enthält. Anschließend werden die Tabellen abgefragt, um eine Liste aller innerhalb dieses Zeitraums ausgeführten SQL-Befehle zu erstellen.
Wenn möglich, sollten Sie dies auf einem ruhigen Entwicklungssystem durchführen - andernfalls riskieren Sie, viel zu viele Daten zurückzubekommen.
-
Erstellen des ersten Schnappschusses Führen Sie den folgenden SQL-Befehl aus, um den ersten Schnappschuss zu erstellen:
create table sql_exec_before as select executions, hash_value from v$sqlarea /
-
Bitten Sie den Benutzer, seine Aufgabe in der Anwendung auszuführen.
-
Erstellen des zweiten Schnappschusses.
create table sql_exec_after as select executions, hash_value from v$sqlarea /
-
Überprüfen der Ergebnisse Nachdem Sie das SQL erfasst haben, ist es an der Zeit, die Ergebnisse abzufragen.
Diese Abfrage listet alle ausgeführten Abfrage-Hashes auf:
select aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
on aft.hash_value = bef.hash_value
where aft.executions > bef.executions
or bef.executions is null;
/
Diese Abfrage zeigt den Hash und das eigentliche SQL an: set pages 999 lines 100 break on hash_value
select hash_value, sql_text
from v$sqltext
where hash_value in (
select aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
on aft.hash_value = bef.hash_value
where aft.executions > bef.executions
or bef.executions is null;
)
order by
hash_value, piece
/
5. Aufräumen Vergessen Sie nicht, die Schnappschusstabellen zu löschen, sobald Sie fertig sind:
drop table sql_exec_before
/
drop table sql_exec_after
/
Oracle analysiert zusammen mit anderen Datenbanken eine gegebene Abfrage, um einen Ausführungsplan zu erstellen. Dieser Plan ist der effizienteste Weg, um die Daten abzurufen.
Oracle bietet die 'explain plan
' Anweisung, die die Abfrage analysiert, aber nicht ausführt, sondern stattdessen eine spezielle Tabelle erstellt, die abgefragt werden kann (die Plan-Tabelle).
Die Syntax (einfache Version, es gibt andere Optionen wie das Markieren der Zeilen in der Plan-Tabelle mit einer speziellen ID oder die Verwendung einer anderen Plan-Tabelle) lautet:
explain plan for
Die Analyse dieser Daten wird in einer anderen Frage oder Ihrer weiteren Recherche behandelt.
Es gibt ein kommerzielles Tool FlexTracer, das verwendet werden kann, um Oracle-SQL-Abfragen zu verfolgen