Oracle/Admin2011. 10. 31. 20:45






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;

시스템이 변경되었습니다.

Posted by 자수성가한 부자