본문 바로가기

Oracle/Tuning

optimizer



Optimizer :

 SQL에 대한 최적의 execution plan을 수립하는 Server process

* Rule-Based Optimizer
  하나의 SQL에 대한 여러 개의 execution plan 가운데 가장 높은 순위의 execution plan을 항상

  사용한다.(Rank Rule 사용) - 그냥 무조건 인덱스를 사용하려고 한다라고 생각하믄 된다.

  - 경험적으로 순위가 매겨진 오퍼레이션에 기초한 실행계획을 선택한다.

  - SQL문을 실행하기 위한 방법이 하나 이상 있다면, 규칙기준 접근 방식은 순위가 높은

    (적은 숫자의) 오퍼레이션을 이용 한다.

  - 순위가 높은 오퍼레이션은 순위가 낮은 오퍼레이션보다 더 빨리 실행된다.

  - 수립될 실행계획이 예측 가능하기 때문에 사용자가 원하는 처리 경로로 유도하기 쉽다.

part 1 : Single Row by RowID
part 2 : Single Row by Cluster Join
part 3 : Single Row by Hash Cluster Key with Unique or Primary key
part 4 : Single Row by Unique or Primary Key
part 5 : Cluster Join
part 6 : Hash Cluster Key
part 7 : Indexed Cluster Key
part 8 : Composite Index
part 9 : Single Column Index
part 10 : Bounded Range Search on Indexed Columns
part 11 : Unbounded Range Search on Indexed Columns
part 12 : Sort-Merge Join
part 13 : MAX or MIN of Indexed Column
part 14 : ORDER BY on Indexed Column
part 15 : Full Table Scan



* Cost-Based Optimizer
  하나의 SQL에 대한 여러 개의 execution plan 가운데 가장 cost가 적은 execution plan을 선택

  한다. 

  - 목적은 대상 Row를 처리하는데 필요한 자원 사용을 최소화

    --> 궁극적으로 데이터를 빨리 처리하는데 목적

  - 비용산정 요소로는 각종 통계정보, SQL형태, hint, optimizer mode, 연산자, index, cluster,

     DBMS 버전, CPU 용량, 메모리 용량, Disk I/O, LINK N/W 비용 등 매우 다양하다.

  - 비용산정 요소 중에서 Data Dictionary 내의 테이블/클러스터 /인덱스에 대한 통계와 데이터

    분포를 중요시 한다.

  - CBO의 성능을 최적의 상태로 유지시키기 위해서는  ANALYZE OBJECT 작업을 정기적으로

     해주는 것이 가장 중요하다.

 

 9i까지는 둘다 사용한다고 한다. 10 버젼부터는 CBO만 사용한다고 하는데...

 ※ 오라클은 기본적으로 둘중에서 선택적으로 사용한다고 하는데 데이터 베이스 구축 후

    통계정보를 생성(ANALYZE..)하지 않는 경우가 많기 때문에 기본적으로 RBO라고

    생각하믄  된다..   
 

 

 ※ ANALYZE 

     ANALYZE  {TABLE/INDEX/CLUSTER} OBJECT_NAME 
                    {COMPUTE/ESTIMATE/DELETE} STATISTICS;

   - 테이블을 ANALYZE 하면 INDEX 들은 같이 ANALYZE 됨

   - ANALYZE 작업을 새로이 수행해야 하는 경우
       테이블이 재 생성된 경우
       새로 클러스터링을 한 경우
       인덱스를 추가 혹은 재 생성한 경우
       다량의 데이터를 SQL이나 배치 어플리케이션을 통해 작업 한 경우
       결산작업이 끝난 경우

 

   - ANALYZE 작업여부를 확인하는 방법

SQL> select table_name , last_analyzed, num_rows from user_tables;

결과 예)

  TABLE_NAME                                  LAST_ANAL       NUM_ROWS
  ----------------------------------- ------------     ----------
  EC_COURSE_PLAN                          30-JAN-03         607345
  EC_COURSE_PLAN_PARTED_YEAR   30-JAN-03         607345
  EC_COURSE_SQ                              30-JAN-03         21092
  EC_COURSE_SQ_IDXMERGE