SPM (SQL Plan Management) 에 baseline 자동 등록
Q : 11g NF 중 하나인 SPM 사용시에 SQL이 baseline에 등록되는 기준은 무엇일까?
(optimizer_capture_sql_plan_baselines 파라미터를 이용한 자동 등록일 경우)
A : SQL이 두번째 실행될 때 등록됨.
테스트
shared pool flush를 한번 해준다.
alter system flush shared_pool;
파라미터를 설정
SQL> alter system set optimizer_capture_sql_plan_baselines = false;
시스템이 변경되었습니다.
SQL> alter system set optimizer_capture_sql_plan_baselines = true;
시스템이 변경되었습니다.
SQL을 실행한다.
SQL> select /* jgh_test */ * from dual;
D
-
X
SQL> select sql_text
from dba_sql_plan_baselines
where sql_text like 'select /* jgh_te%'; 2 3
선택된 레코드가 없습니다.
SQL> select sql_text, version_count, executions, loads
from v$sqlarea
where sql_text like 'select /* jgh_te%'; 2 3
SQL_TEXT VERSION_COUNT EXECUTIONS LOADS
-------------------------------------------------- ------------- ---------- ----------
select /* jgh_test */ * from dual 1 1 1
같은 SQL을 두번째 실행한다.
SQL> select /* jgh_test */ * from dual;
D
-
X
baseline 뷰에 등록되었는지 확인한다. 등록되었다.
SQL> select sql_text
from dba_sql_plan_baselines
where sql_text like 'select /* jgh_te%'; 2 3
SQL_TEXT
--------------------------------------------------
select /* jgh_test */ * from dual
실행횟수가 2인 것을 확인할 수 있다. 결론은 하드파싱이 발생횟수가 2회라서 그런 것은 아니고,
실행이 2번째라서 baseline 뷰에 등록이 되었다.
SQL> select sql_text, version_count, executions, loads
from v$sqlarea
where sql_text like 'select /* jgh_te%'; 2 3
SQL_TEXT VERSION_COUNT EXECUTIONS LOADS
-------------------------------------------------- ------------- ---------- ----------
select /* jgh_test */ * from dual 1 2 1
다시 파라미터를 원래대로 변경한다.
alter system set optimizer_capture_sql_plan_baselines = false;
추가 질문
버전카운트 증가시에도 등록이 되나?
SQL> alter system flush shared_pool;
시스템이 변경되었습니다.
SQL> alter system set optimizer_capture_sql_plan_baselines = true;
시스템이 변경되었습니다.
SQL> select /* jgh_test2 */ * from dual;
D
-
X
SQL> select sql_text
from dba_sql_plan_baselines
where sql_text like 'select /* jgh_test2%'; 2 3
선택된 레코드가 없습니다.
SQL> select sql_text, version_count, executions, loads
from v$sqlarea
where sql_text like 'select /* jgh_test2%'; 2 3
SQL_TEXT VERSION_COUNT EXECUTIONS LOADS
-------------------------------------------------- ------------- ---------- ----------
select /* jgh_test2 */ * from dual 1 1 1
optimizer 관련 파라미터를 변경한다.
SQL> alter system set optimizer_mode = 'FIRST_ROWS';
시스템이 변경되었습니다.
같은 SQL을 두번째 실행한다.
SQL> select /* jgh_test2 */ * from dual;
D
-
X
baseline에 등록되었다.
SQL> select sql_text
from dba_sql_plan_baselines
where sql_text like 'select /* jgh_test2%'; 2 3
SQL_TEXT
--------------------------------------------------
select /* jgh_test2 */ * from dual
역시 실행횟수가 baseline 등록여부를 결정한다.
optimizer 관련 변수가 변경되어 version_count가 1증가하였다.
SQL> select sql_text, version_count, executions, loads
from v$sqlarea
where sql_text like 'select /* jgh_test2%'; 2 3
SQL_TEXT VERSION_COUNT EXECUTIONS LOADS
-------------------------------------------------- ------------- ---------- ----------
select /* jgh_test2 */ * from dual 2 2 2
파라미터를 원래대로 변경
SQL> alter system set optimizer_capture_sql_plan_baselines = false;
시스템이 변경되었습니다.