OPTIMIZER INVALIDATION PERIOD

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 기본 정보

[편집] Parameter 정보


Syntax _OPTIMIZER_INVALIDATION_PERIOD
설정방법
  • Parameter File
  • ALTER SYSTEM SET "_OPTIMIZER_INVALIDATION_PERIOD" = 18000
  • ALTER SESSION SET "_OPTIMIZER_INVALIDATION_PERIOD" = 18000
버전 및 기본값
9iR2 10gR1 10gR2 11g
- 18000 18000  ?



[편집] 설명

Oracle 10g부터는 통계 정보 수집 시 관련된 SQL Cursor를 즉시 invalidation시키지 않고, 일정 시간이 지나 후에 invalidation 시킨다. _OPTIMIZER_INVALIDATION_PERIOD 파라미터는 이 값을 결정한다. 기본값은 18000(초)(=5시간)이다. 즉, 통계 정보 수집에 의해 통계 정보가 변경된 후 약 5시간에 걸쳐 랜덤한 시점에 해당 Cursor가 실행될 때 invalidation이 발생한다. 이것을 Auto Invalidation이라고 부른다. 일정 시간에 걸쳐 랜덤하게 Cursor를 Invalidation함으로써 특정 시점에 Hard Parse가 한꺼번에 몰리는 현상을 피할 수 있다.

DBMS_STATS 패키지를 이용해 통계 정보 수집시 NO_INVALIDATE 옵션을 이용해 SQL Cursor가 invalidation 되는 시점을 지정할 수 있다. NO_INVALIDATE 옵션 값에 의한 invalidation 작동 방식은 다음과 같다.

  • NO_INVALIDATE = False : 통계 정보 변경 시 관련된 SQL Cursor들이 즉시 invalidation된다. 9i에서의 기본값이다.
  • NO_INVALIDATE = True : 통계 정보 변경 시 관련된 SQL Cursor들을 invalidation하지 않는다. SQL Cursor가 Shared Pool에서 Flush된 후 Reload될 때 변경된 통계 정보가 반영된다.
  • NO_INVALIDATE = DBMS_STATS.AUTO_INVALIDATE : 통계 정보 변경시 관련된 SQL Cursor들을 일정 시간(_OPTIMIZER_INVALIDATION_PERIOD)에 걸쳐 골고루(랜덤하게) invalidation한다. 10g에서의 기본값이다. 엄밀하게 말하면 기존 SQL Cursor들을 invalidation시키는 것이 아니라 새로운 Child Cursor를 생성한다. 생성된 Child Cursor를 V$SQL_SHARED_CURSOR 뷰에서 조회해보면 roll_invalid_mismatch에 의해 Mismatch가 발생한 것으로 처리되는 것을 확인할 수 있다.

[편집] 참고 사항

[편집] 10g에서의 통계 정보 수집

Oracle 10g부터는 no_invalidate 옵션의 기본값이 DBMS_STATS.AUTO_INVALIDATE이다. 즉, 통계 정보를 재수집해도 관련된 SQL Cursor들이 invalidate되지 않는다. 따라서 통계 정보를 반영해주려면 Shared Pool을 Flush(alter system flush shared_pool)을 해주어야 한다.

통계 정보 수집의 기본 가이드는 Oracle의 기본 행동 양식(즉 Auto invalidation)을 사용하되, 특정 SQL Cursor를 즉시 invalidation하려면 Session 레벨에서 _OPTIMIZER_INVALIDATION_PERIOD 파라미터 값을 줄이는 것이다.

alter system set "_optimizer_invalidation_period" = 1;


[편집] 관련된 정보

  1. DBMS_STATS 패키지


[편집] 외부 참조