set linesize 200
set pagesize 40
col sql_plan_hash_value for 9999999999 heading 'Sql|Plan Hash'
col rows_processed for 999999999 heading 'Rows|Processed'
col SORTS for 9999999
set verify off
col last_load for a19
col plan_hash_value for 9999999999 heading "Plan|Hash Value"
select plan_hash_value,to_char(LAST_LOAD_TIME,'DD-MON-YY HH24:MI:SS') last_load,SORTS,FETCHES,EXECUTIONS,PARSE_CALLS,DISK_READS,DIRECT_WRITES,BUFFER_GETS,ROWS_PROCESSED,HASH_VALUE,OBJECT_STATUS from gv$sqlarea where SQL_ID = '&&sqlid';
PROMPT +---------------------------------------+
PROMPT | &&sqlid Query Last 5 plan history
PROMPT +---------------------------------------+
set lines 200
set pagesize 200
col snap_id for 999999
col instance_number for 9999
col execs for 999,999,999
col avg_etime for 999,999.999
col avg_lio for 999,999,999
col SQL_PROFILE for a32
col begin_interval_time for a26
col node for 99999
--define sqlid=&1
set verify off
select * from (select ss.snap_id, ss.instance_number node, to_char(begin_interval_time,'DD-MON-YY HH24:MI:SS') Begin_Interval, sql_id, plan_hash_value,
nvl(executions_delta,0) execs,
(elapsed_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta))/1000000 avg_etime,
(buffer_gets_delta/decode(nvl(buffer_gets_delta,0),0,1,executions_delta)) avg_lio,SQL_PROFILE
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where sql_id ='&&sqlid'
and ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and executions_delta > 0
--and begin_interval_time > sysdate-1/24
order by begin_interval_time desc,1, 2)
where rownum <= 5
/
PROMPT +---------------------------------------+
PROMPT | &&sqlid Avg Exec Plan History
PROMPT +---------------------------------------+
set lines 200 pages 200
col execs for 999,999,999
col etime for 999,999,999 heading 'Exec_Time(sec)'
col avg_etime for 999,990.999 heading 'Avg |Exec_Time(sec)'
col avg_cpu_time for 999,999.999
col avg_lio for 999,999,999 heading 'Avg | Logical IO'
col avg_pio for 9,999,999 heading 'Avg | Physical IO'
col begin_interval_time for a30
col node for 99999
select sql_id, plan_hash_value,
sum(execs) execs,
sum(etime) etime,
sum(etime)/sum(execs) avg_etime,
sum(cpu_time)/sum(execs) avg_cpu_time,
sum(lio)/sum(execs) avg_lio,
sum(pio)/sum(execs) avg_pio
from (
select ss.snap_id, ss.instance_number node, begin_interval_time, sql_id, plan_hash_value,
nvl(executions_delta,0) execs,
elapsed_time_delta/1000000 etime,
(elapsed_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta))/1000000 avg_etime,
buffer_gets_delta lio,
disk_reads_delta pio,
cpu_time_delta/1000000 cpu_time,
(buffer_gets_delta/decode(nvl(buffer_gets_delta,0),0,1,executions_delta)) avg_lio,
(cpu_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta)) avg_cpu_time
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where sql_id = '&&sqlid'
and ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and executions_delta > 0
)
group by sql_id, plan_hash_value
order by 5
/
==================================
------------processing sql id ------------------------
set linesize 200
set pagesize 40
col sql_plan_hash_value for 9999999999 heading 'Sql|Plan Hash'
col rows_processed for 999999999 heading 'Rows|Processed'
set verify off
col last_load for a19 heading "Last Load Time"
col plan_hash_value for 9999999999 heading "Plan|Hash Value"
select plan_hash_value,to_char(LAST_LOAD_TIME,'DD-MON-YY HH24:MI:SS') last_load,SORTS,FETCHES,EXECUTIONS,PARSE_CALLS,DISK_READS,DIRECT_WRITES,BUFFER_GETS,ROWS_PROCESSED,HASH_VALUE,OBJECT_STATUS from gv$sqlarea where SQL_ID = '&&sqlid';
=========================================
=====stale stat sql id ============
set lines 500
col table_owner for a15
col table_name for a30
col partition_name for a30
select distinct b.table_owner, b.table_name, b.partition_name, b.inserts, b.updates, b.deletes, b.TRUNCATED,c.STALE_STATS,
to_char(b.timestamp, 'mm/dd/yyyy hh24:mi') timestamp, to_char(c.last_analyzed, 'mm/dd/yyyy hh24:mi') last_analyzed,
c.num_rows
from (select distinct sql_id, object#, object_name, object_owner from gv$sql_plan where sql_id = '&&sqlid' UNION select distinct sql_id, object#, object_name, object_owner from dba_hist_sql_plan where sql_id = '&&sqlid') a
, sys.dba_tab_modifications b, dba_tab_statistics c
where a.sql_id = '&&sqlid'
and a.OBJECT_OWNER = b.table_owner
and a.OBJECT_NAME = b.table_name
and b.table_owner = c.owner
and b.table_name = c.table_name
and NVL(b.partition_name,'NONE') = NVL(c.partition_name,'NONE')
and b.table_name is not null
order by b.table_owner, b.table_name, b.partition_name;
========================================================
======Plan change REport ==============
with samples as
(select *
from dba_hist_sqlstat st
join dba_hist_snapshot sn
using (snap_id, instance_number)
where
-- sql_id='sqlid'
-- parsing_schema_name = 'schema'
--and module 'DBMS_SCHEDULER' -- no sql tuning task
begin_interval_time between sysdate - '&num_days' and sysdate
and executions_delta > 0),
/* just statements that had at least 2 different plans during that time */
sql_ids as
(select sql_id,
count(distinct plan_hash_value) plancount
from samples
group by sql_id
having count(distinct plan_hash_value) > 2),
/* per combination of sql_id and plan_hash_value, elapsed times per execution */
plan_stats as
(select sql_id,
plan_hash_value,
min(parsing_schema_name),
count(snap_id) snap_count,
max(end_interval_time) last_seen,
min(begin_interval_time) first_seen,
sum(executions_delta) total_execs,
sum(elapsed_time_delta) / sum(executions_delta) elapsed_per_exec_thisplan
from sql_ids
join samples
using (sql_id)
group by sql_id, plan_hash_value),
/* how much different is the elapsed time most recently encountered from other elapsed times in the measurement interval? */
elapsed_time_diffs as
(select p.*,
elapsed_per_exec_thisplan - first_value(elapsed_per_exec_thisplan)
over(partition by sql_id order by last_seen desc) elapsed_per_exec_diff,
(elapsed_per_exec_thisplan - first_value(elapsed_per_exec_thisplan)
over(partition by sql_id order by last_seen desc)) / elapsed_per_exec_thisplan elapsed_per_exec_diff_ratio
from plan_stats p),
/* consider just statements for which the difference is bigger than our configured threshold */
impacted_sql_ids as
(select *
from elapsed_time_diffs ),
/* for those statements, get all required information */
all_info as
(select sql_id,
plan_hash_value,
-- parsing_schema_name,
snap_count,
last_seen,
first_seen,
total_execs,
round(elapsed_per_exec_thisplan / 1e6, 2) elapsed_per_exec_thisplan,
round(elapsed_per_exec_diff / 1e6, 2) elapsed_per_exec_diff,
round(100 * elapsed_per_exec_diff_ratio, 2) elapsed_per_exec_diff_pct,
round(max(abs(elapsed_per_exec_diff_ratio))
over(partition by sql_id), 2) * 100 max_abs_diff,
round(max(elapsed_per_exec_diff_ratio) over(partition by sql_id), 2) * 100 max_diff,
'select * from table(dbms_xplan.display_awr(sql_id=>''' || sql_id ||
''', plan_hash_value=>' || plan_hash_value || '));' xplan
from elapsed_time_diffs
where sql_id in (select sql_id from impacted_sql_ids))
/* format the output */
select
a.sql_id,
plan_hash_value,
-- parsing_schema_name,
a.snap_count,
total_execs,
to_char(a.elapsed_per_exec_thisplan, '999999.99') elapsed_per_exec_thisplan,
to_char(a.elapsed_per_exec_diff, '999999.99') elapsed_per_exec_diff,
to_char(a.elapsed_per_exec_diff_pct, '999999.99') elapsed_per_exec_diff_pct,
to_char(first_seen, 'dd-mon-yy hh24:mi') first_seen,
to_char(last_seen, 'dd-mon-yy hh24:mi') last_seen
--xplan
from all_info a where sql_id in (select distinct sql_id from all_info where elapsed_per_exec_diff_pct < -50)
order by sql_id, elapsed_per_exec_diff_pct;
=============================
=====explain plan from sql_id==============
SELECT t.*
FROM gv$sql s, table(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number)) t
WHERE s.sql_id='&&sql_id';
=============================