Jag tyckte att den här SQL-satsen var ett användbart ställe att börja (tyvärr att jag inte kan tillskriva det den ursprungliga författaren, jag hittade den någonstans på internet):
SELECT * FROM
(SELECT
sql_fulltext,
sql_id,
elapsed_time,
child_number,
disk_reads,
executions,
first_load_time,
last_load_time
FROM v$sql
ORDER BY elapsed_time DESC)
WHERE ROWNUM < 10
/
Detta hittar de översta SQL-satserna som för närvarande lagras i SQL-cachen sorterade efter förfluten tid. Påståenden kommer att försvinna från cachen med tiden, så det kanske inte är bra att försöka diagnostisera gårdagens batchjobb när du rullar till jobbet vid middagstid.
Du kan också prova att beställa efter disk_reads och körningar. Exekveringar är användbara eftersom vissa dåliga applikationer skickar samma SQL-sats alldeles för många gånger. Denna SQL förutsätter att du använder bindningsvariabler korrekt.
Sedan kan du ta sql_id
och child_number
av ett uttalande och mata in dem i denna baby:-
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', &child));
Detta visar den faktiska planen från SQL-cachen och hela texten i SQL.