Oracle Database 10g부터 구성 요소가 문제 감지 및 자체 튜닝 목적을 위해 통계를 수집, 유지 관리 및 활용할 수 있도록 서비스를 제공하는 infrastructure 입니다.
MMON(Memory Monitor), MMNL(Memory Monitor Light) 백그라운드 프로세스에 의해 수집되어 SYSAUX tablepsace에 저장된다.
수집간격 : 기본값 60분
Retention 기간 : 기본값 7일(11g 8일)
수집 레벨(statistics_level)
show parameter statistics_level

select * from dba_hist_wr_control;

execute dbms_workload_repository.modify_snapshot_settings(interval=>20, retention=>60*24*60, topnsql=>50)
select snap_id, instance_number, begin_interval_time, end_interval_time
from dba_hist_snapshot
order by 1;

execute dbms_workload_repository.drop_snapshot_range(low_snap_id=>306 ,high_snap_id=>320);
drop table hr.emp purge;
create table hr.emp
nologging
as
select rownum emp_id, last_name, first_name, job_id, hire_date, salary, commission_pct,email, department_id
from hr.employees, (select rownum emp_id from dual connect by level <= 10000)
order by dbms_random.value;
select num_rows, blocks, avg_row_len from dba_tables where owner='HR' and table_name='EMP';

<<SYS session>>
select dbms_workload_repository.create_snapshot from dual;

<<HR session>>
- direct path read 방식을 안하겠다는 이벤트
alter session set events '10949 trace name context forever, level 1';
select * from hr.emp where emp_id = 100;
<<SYS session>>
select dbms_workload_repository.create_snapshot from dual;

select snap_id, instance_number, begin_interval_time, end_interval_time
from dba_hist_snapshot
order by 1;

@$ORACLE_HOME/rdbms/admin/awrrpt.sql
text로 받기
스냅샷 범위로 받기

파일이름

os로 나와서 local에서 확인해보면 만들어진 awr report가 있다.
vi awr_example


physical i/o가 많이 발생한 sql id로 실행계획 확인
select * from table(dbms_xplan.display_awr('fb86gfcy9j69m'));

- 생성하기
declare
my_task_name varchar2(50);
my_sqltext clob;
begin
my_sqltext := 'select * from hr.emp where emp_id = 100';
my_task_name := dbms_sqltune.create_tuning_task(
sql_text => my_sqltext,
user_name => 'hr',
task_name => 'my_sql_tuning_task');
end;
/
- 실제 수행
execute dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task')
- 리포트 보기
set long 999999
set longchunksize 100000
set linesize 200
select dbms_sqltune.report_tuning_task('my_sql_tuning_task') from dual;
인덱스 생성을 추천해준다.

sql tuning advisor, sql access advisor 2개가 있는데, 해당 문장은 문장 자체에는 문제가 없기 때문에 sql tuning advisor가 아니라 sql access advisor가 작동된다. join의 순서를 튜닝해야 하는 경우에는 sql tuning advisor가 작동된다.

- 해당 task는 딕셔너리 파일에 저장되어 있기 때문에 지우는 작업도 필요하다.
execute dbms_sqltune.drop_tuning_task(task_name => 'my_sql_tuning_task')
<<SYS session >>
grant execute on dbms_lock to hr;
<<hr session 1>>
create table hr.ash_tab(id number, name varchar2(10));
insert into hr.ash_tab(id,name) values(1,user);
commit;
<<hr session 1>>
begin
for i in 1..10 loop
update hr.ash_tab set id = 1;
dbms_lock.sleep(1);
commit;
end loop;
end;
/
<<hr session 2>>
begin
for i in 1..10 loop
update hr.ash_tab set id = 1;
dbms_lock.sleep(1);
commit;
end loop;
end;
/
<<SYS session >>
특정 시간 범위 내에서 활성 세션 기록(v$active_session_history)을 조회하여 세션의 상태, 실행 중인 SQL, 이벤트, 및 블로킹 세션 정보를 확인
select sample_time, session_id, session_state, sql_id,
(select sql_text from v$sql where sql_id = h.sql_id) sql_text,
event, blocking_session
from v$active_session_history h
where sample_time between to_date('2024-11-14 14:00:00','yyyy-mm-dd hh24:mi:ss')
and to_date('2024-11-14 14:26:00','yyyy-mm-dd hh24:mi:ss');
