← Performance
Oracle · Performance

How to check SQL execution history from AWR in Oracle

Show per-snapshot execution counts and averages (reads, gets, rows, CPU, elapsed) for a given Oracle SQL_ID over the last ~14 days from AWR.

Tested on11g12c18c19c21c23ai26ai

Give a SQL_ID; get its performance history across AWR snapshots for the last ~14 days. Shows average reads, buffer gets, rows, CPU time, and elapsed time per snap so you can see how the same SQL behaves under different loads or plans.

DBA_HIST_SQLSTAT and DBA_HIST_SNAPSHOT are part of Oracle Diagnostic Pack and require that license on Enterprise Edition.

COL snap_time FOR a15
SET PAGES 1000 LINES 220

WITH s AS (
  SELECT MAX(snap_id)                AS t,
         MAX(snap_id) - (14 * 24 * 4) AS f
  FROM   dba_hist_snapshot
)
SELECT *
FROM (
  SELECT a.instance_number AS inst#,
         a.snap_id         AS snap#,
         a.sql_id,
         TO_CHAR(b.end_interval_time, 'mon-dd hh24:mi') AS snap_time,
         a.executions_delta AS execs,
         (a.disk_reads_delta     / DECODE(a.executions_delta, 0, 1, a.executions_delta)) AS avg_rds,
         (a.buffer_gets_delta    / DECODE(a.executions_delta, 0, 1, a.executions_delta)) AS avg_gets,
         (a.rows_processed_delta / DECODE(a.executions_delta, 0, 1, a.executions_delta)) AS avg_rows,
         (a.cpu_time_delta       / DECODE(a.executions_delta, 0, 1, a.executions_delta) / 1000000) AS avg_cpu_sec,
         a.plan_hash_value,
         (a.elapsed_time_delta   / DECODE(a.executions_delta, 0, 1, a.executions_delta) / 1000000) AS avg_elapsed_sec,
         c.value / 1000000 / 60 / 15 AS aas,
         s.f
  FROM   s,
         dba_hist_sqlstat  a,
         dba_hist_snapshot b,
         (
           SELECT y.dbid, snap_id, instance_number,
                  NVL(value - LAG(value, 1) OVER (
                                PARTITION BY y.stat_name, instance_number, y.dbid
                                ORDER BY snap_id), 0) AS value
           FROM   dba_hist_sys_time_model y, s
           WHERE  y.snap_id BETWEEN s.f AND s.t
           AND    y.stat_name = 'DB time'
         ) c
  WHERE  a.snap_id         = b.snap_id
  AND    b.snap_id         = c.snap_id
  AND    a.dbid            = b.dbid
  AND    b.dbid            = c.dbid
  AND    a.instance_number = b.instance_number
  AND    b.instance_number = c.instance_number
  AND    a.snap_id BETWEEN s.f AND s.t
  AND    a.sql_id IN ('&&sql_id')
  ORDER BY a.instance_number, a.sql_id, a.snap_id
)
WHERE snap# > f;
performanceawrsql tuningdba_hist_sqlstat