Step 1. Recent Executions from Cursor Cache
COL inst_id FOR 99
COL sql_id FOR a13
COL child_number FOR 999
COL plan_hash_value FOR 9999999999
COL last_active_time FOR a20
COL execs FOR 999,999
COL elapsed_s FOR 999,999,999.99
COL cpu_s FOR 999,999,999.99
COL io_s FOR 999,999,999.99
COL buffer_gets FOR 999,999,999
COL disk_reads FOR 999,999,999
COL rows_proc FOR 999,999,999
SELECT inst_id,
sql_id,
child_number,
plan_hash_value,
TO_CHAR(last_active_time,'YYYY-MM-DD HH24:MI:SS') last_active_time,
executions execs,
ROUND(elapsed_time/1e6,2) elapsed_s,
ROUND(cpu_time/1e6,2) cpu_s,
ROUND(user_io_wait_time/1e6,2) io_s,
buffer_gets,
disk_reads,
rows_processed rows_proc
FROM gv$sql
WHERE sql_id='&sql_id'
ORDER BY last_active_time COL wait_or_class FOR a35
COL op FOR a40
SELECT NVL(event, wait_class) AS wait_or_class,
COUNT(*) samples,
ROUND(100*RATIO_TO_REPORT(COUNT(*)) OVER (),1) pct
FROM dba_hist_active_sess_history
WHERE sql_id='&sql_id'
GROUP BY NVL(event, wait_class)
ORDER BY samples DESC FETCH FIRST 20 ROWS ONLY;
SELECT plan_hash_value,
sql_plan_line_id,
sql_plan_operation||' '||sql_plan_options op,
COUNT(*) samples
FROM dba_hist_active_sess_history
WHERE sql_id='&sql_id'
GROUP BY plan_hash_value, sql_plan_line_id, sql_plan_operation, sql_plan_options
ORDER BY samples DESC FETCH FIRST 20 ROWS ONLY;
Step 2. Execution History from AWR (no time filter)
COL snap_time FOR a20
COL plan_hash_value FOR 9999999999
COL execs FOR 999,999
COL elapsed_s FOR 999,999,999.99
COL cpu_s FOR 999,999,999.99
COL io_s FOR 999,999,999.99
COL gc_s FOR 999,999,999.99
COL buffer_gets FOR 999,999,999
COL disk_reads FOR 999,999,999
COL rows_proc FOR 999,999,999
SELECT TO_CHAR(s.begin_interval_time,'YYYY-MM-DD HH24:MI') snap_time,
ss.plan_hash_value,
ss.executions_delta execs,
ROUND(ss.elapsed_time_delta/1e6,2) elapsed_s,
ROUND(ss.cpu_time_delta/1e6,2) cpu_s,
ROUND(ss.iowait_delta/1e6,2) io_s,
ROUND(ss.cluster_wait_time_delta/1e6,2) gc_s,
ss.buffer_gets_delta buffer_gets,
ss.disk_reads_delta disk_reads,
ss.rows_processed_delta rows_proc
FROM dba_hist_sqlstat ss
JOIN dba_hist_snapshot s
ON ss.snap_id = s.snap_id
AND ss.dbid = s.dbid
AND ss.instance_number = s.instance_number
WHERE ss.sql_id='&sql_id'
ORDER BY s.begin_interval_time DESC;
Step 3. ASH Analysis (Top Waits & Plan Lines)
COL wait_or_class FOR a35
COL op FOR a40
SELECT NVL(event, wait_class) AS wait_or_class,
COUNT(*) samples,
ROUND(100*RATIO_TO_REPORT(COUNT(*)) OVER (),1) pct
FROM dba_hist_active_sess_history
WHERE sql_id='&sql_id'
GROUP BY NVL(event, wait_class)
ORDER BY samples DESC FETCH FIRST 20 ROWS ONLY;
SELECT plan_hash_value,
sql_plan_line_id,
sql_plan_operation||' '||sql_plan_options op,
COUNT(*) samples
FROM dba_hist_active_sess_history
WHERE sql_id='&sql_id'
GROUP BY plan_hash_value, sql_plan_line_id, sql_plan_operation, sql_plan_options
ORDER BY samples DESC FETCH FIRST 20 ROWS ONLY;
Step 4. RAC-Specific (GC waits by Instance & Object)
-- Instance distribution
SELECT instance_number, COUNT(*) samples
FROM dba_hist_active_sess_history
WHERE sql_id='&sql_id'
GROUP BY instance_number
ORDER BY samples DESC;
-- Objects contributing to GC waits
SELECT NVL(o.owner||'.'||o.object_name,'-') object_name,
COUNT(*) samples
FROM dba_hist_active_sess_history a
LEFT JOIN dba_objects o ON a.current_obj#=o.object_id
WHERE a.sql_id='&sql_id'
AND a.wait_class='Cluster'
GROUP BY NVL(o.owner||'.'||o.object_name,'-')
ORDER BY samples DESC FETCH FIRST 15 ROWS ONLY;