3.1.2.4. 실행계획의 고정화(Stability)

  • 아우트라인(Outline)
    \- 과거에 수립되었던 실행계획의 요약본을 저장하고 있다가 이것을 참조하여 실행계획을 수립하는 기능
    \- 일반적으로 통계정보의 변화에 따라 변동되는 실행계획을 최적화된 실행계획으로 고정시키고자 하는 용도로 사용


  • 아우트라인 사용의 바람직한 방법
    \- 잘 정비된 옵티마이징 팩터와 적절한 SQL을 기반으로 대부분의 경우는 옵티마이저에게 맡기고
    \- 특별히 문제가 있는 경우에 대해서만 아우트라인으로 통제
    ■ 카테고리(Category) : Outline의 선별적인 적용을 가능하게 하기 위하여 지정한 그룹


가) 아우트라인 생성과 조정
  • DBMS_OUTLN, DBMS_OUTLN_EDIT 패키지의 프로시져로 아우트라인 생성 및 조정
    ■ CREATE_OUTLINEL 지정된 건을 공유캐시에서 찾아 아우트 라인을 생성한다.
    ■ CLEAR_USED: 지정된 아우트 라인을 제거한다.
    ■ DROP_BY_CAT: 지정한 카테고리에 속한 아우트 라인을 제거한다.
    ■ DROP_UNUSED: SQL 파싱에 사용된 적이 없는 아우트 라인을 제거한다.
    ■ UPDATE_BY_CAT: 어떤 카테고리를 새로운 카테고리로 변경한다.
    ■ GENERATE_SIGNATURE: 지정한 SQL 문에 대한 식별자를 생성한다.
나) 아우트 라인의 관찰
  • 아우트라인 조회용 뷰
USER_OUTLINES생성되어 있는 아우트라인에 대한 정보
USER_OUTLINE_HINTS생성되어 있는 아우트라인에 대한 힌트 정보
다) 오라클 업그레이드 시에 적용
  • 오라클 업그레이드 시 Outline 수집, 적용 절차

 (1) 현재의 규칙기준으로 수행되는 SQL에 대하여 다음과 같이 특정 카테고리를 주고 아우트라인을 생성
      ALTER SESSION SET CREATE_STORED_OUTLINES= category_name;
      ALTER SYSTEM 구문 : 시스템 전역으로 적용

 (2) 대부분의 중요한 SQL에 대해 아우트 라인이 생성되도록 가능하다면 오랜기간 동안 수집하는 것이 좋다.
      또는 월 단위 이상이나 특정한 기간에만 수행되는 어플리케이션은 별도의 처리를 해주는 것이 좋다.

 (3) 아우트 라인 생성을 종료 시키려면 CREATE_STORED_OUTLINES 파라미터를 FALSE로 지정
      ALTER SESSION SET CREATE_STORED_OUTLINES= FALSE  

 (4) 업그레이드 후 DBMS_STATS 이용하여 통계정보 생성
 
 (5) 필요 시 USR_STORED_OUTLINES 를 이용하여 아우트라인 적용(과거 실행 계획으로 복원)
    ALTER SESSION SET USE_STORED_OUTLINES = category_name;


3.1.2.5. 옵티마이저의 한계

  • 규칙기준 옵티마이저의 한계
    통계 값을 고려하지 않고 규칙에 의해 예측하므로 데이터 량, 분포에 따른 정확한 예측을 할 수 없음


  • 비용기준 옵티마이저의 한계
    완벽할 수 없는 통계 정보를 바탕으로 정확한 처리 범위를 예측할 수 있느냐에 대한 한계
    \- Equal(=)연산이 아닌 'LIKE, <,>,BETWEEN'등의 사용 시 정확한 분포도 계산이 어려움.
    \- 히스토그램이 없어 컬럼내의 모든 값이 분포도가 같다고 가정한다면 - 오차 발생 가능성 내포
    결합된 컬럼에 대해 분포도를 보유할 수 없음


  • Histogram을 사용할 경우
    • 상수가 아니라 변수인 상태에서 실행 계획이 수립되어야 한다면 활용가치가 없어짐
  • 결론적으로
1다양한 사용 형태를 만족할 수 있도록 종합적이고 전략적인 차원에서 적절한 인덱스나 클러스터링을 결정하고
2수준 높은 SQL을 구사하는 것

이 중요함