Ich möchte die neuesten ausgeführten Anweisungen zusammen mit Leistungsindikatoren in meine Datenbank aufnehmen.
Als solches möchte ich wissen, welche SQL-Anweisungen am meisten CPU / DISK-intensiv waren.
Ich möchte die neuesten ausgeführten Anweisungen zusammen mit Leistungsindikatoren in meine Datenbank aufnehmen.
Als solches möchte ich wissen, welche SQL-Anweisungen am meisten CPU / DISK-intensiv waren.
Antworten:
Hier ist die SQL, um die Arbeit zu erledigen. Zur Prüfung offen.
Schritt 1: Bestimmen Sie die Installations- und Benutzer-IDs.
SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';
Schritt 2:
SELECT
s.sid
,s.CLIENT_INFO
,s.MACHINE
,s.PROGRAM
,s.TYPE
,s.logon_time
,s.osuser
,sq.sorts
,sq.DISK_READS
,sq.BUFFER_GETS
,sq.ROWS_PROCESSED
,sq.SQLTYPE
,sq.SQL_TEXT
FROM gv$session s
, gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
AND s.inst_id = :inst_id -- replace with instID from above
AND s.sid = :sid -- replace with ID from above
AND sq.inst_id = s.inst_id
Möglicherweise werden mehrere IDs und Instanz-IDs zurückgegeben. Es liegt also an den Benutzern, wie sie diese Daten in einer Weboberfläche usw. verwenden möchten.
in
Operator mit Tupeln, also aus obigem Beispiel... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
Die Oracles Enterprise Monitor-Konsole zeigt eine Fülle von Informationen darüber an, welche SQL-Abfragen die maximale CPU-Auslastung, Engpässe, die höchste Aktivität in der Datenbank und das Blockieren von SQLs et al. Beanspruchen.
Für einen historischen Ansatz können Sie die AWR- Berichte von Oracle verwenden , um Bereiche zu identifizieren, die Sie betreffen.
Sie können auch verwenden V$SQL
, es gibt mehrere interessante Spalten RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT
usw.
Auf diese Weise erhalten Sie die Top-10-Anweisungen beim Lesen von Datenträgern (Anmerkung: Dies ist für alle Ausführungen kumulativ):
select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11
Wenn die Anweisung noch vorhanden ist V$SQL_PLAN
, können Sie einen tatsächlichen Erklärungsplan für die Abfrage abrufen:
select * from table(dbms_xplan.display_cursor('sql_id',child_number));
Ich benutze auch gerne, V$SQL_PLAN
da es gute Infos enthält. Wenn statistics_level=ALL
du kannst V$SQL_PLAN_STATISTICS
.