본문 바로가기

oracle

[ORACLE] SQL PLAN 변경 확인

728x90

-- SQLPLAN 확인
/* 입력하는 날짜 두 날짜의 plan 비교(date1, date2 둘다 yyyymmdd 형태로 입력) */
with date1 as (
select distinct sql_id, plan_hash_value
from dba_hist_sqlstat a inner join dba_hist_snapshot b 
    on (a.snap_id=b.snap_id and a.dbid=b.dbid and a.instance_number=b.instance_number)
where END_INTERVAL_TIME between to_date(:date1-7,'yyyymmdd') and to_date(:date1,'yyyymmdd')+0.99999 /* date1-7일 ~ date1까지 데이터가 before */
  and PARSING_SCHEMA_NAME in('DSDBIUSR','INOUSR','ADFUSR')  /* 비교가 필요한 계정 입력*/
  and EXECUTIONS_DELTA>0
),
date2 as (
select distinct sql_id, plan_hash_value
from dba_hist_sqlstat a inner join dba_hist_snapshot b 
    on (a.snap_id=b.snap_id and a.dbid=b.dbid and a.instance_number=b.instance_number)
where END_INTERVAL_TIME between to_date(:date2,'yyyymmdd') and to_date(:date2,'yyyymmdd')+0.99999  /* date2가 after */
  and PARSING_SCHEMA_NAME in('DSDBIUSR','INOUSR','ADFUSR') /* 비교가 필요한 계정 입력*/
  and EXECUTIONS_DELTA>0
)
select sql_id,
       date1.plan_hash_value before_plan,
       date2.plan_hash_value after_plan,
       decode(date1.plan_hash_value,date2.plan_hash_value,'SAME','CHECK') AS CHECK_COL
from date1 inner join date2 using (sql_id)
where decode(date1.plan_hash_value,date2.plan_hash_value,'SAME','CHECK')='CHECK'
order by 4, 1
;

728x90