제1절 옵티마이저

  • 옵티마이저(Optimizer)는 SQL 을 가장 빠르고 효율적으로 수행할 최적(최저비용)의 처리경로를 생성해주는
    DBMS내부의 핵심엔진으로서, 옵티마이저에 의해 생성한 SQL 처리절차를 '실행계획(Execution Plan)'이라고 부른다.
  • 규칙기반 옵티마이저(Rule-Based Optimizer)는 미리 정해 놓은 규칙에 따라 액세스 경로를 평가하고 실행계획을 선택한다.
  • 비용기반 옵티마이저(Cost-Based Optimizer)는 비용을 기반으로 최적화를 수행한다. 여기서 '비용(Cost)'은
    쿼리를 수행하는데 소요되는 일량 또는 시간을 뜻하며, 어디까지나 예상치이다.
  • 옵티마이저가 사람이 만든 소프트웨어 엔진에 불과하며 결코 완벽할 수 없다. 이런 부족한 부분을 사용자가 메워주려면
    옵티마이저 원리에 대한 정확한 이해가 필요하다.
  • 실행계획을 수립할 때 CBO는 SQL 문장에서 액세스할 데이터 특성을 고려하기 위해 통계정보를 이용한다.
    따라서 통계정보가 항상 데이터 상태를 정확하게 반영하도록 관리해 주어야 한다.
  • 선택도(Selectivity) 는 전체 대상 레코드 중에서 특정 조건에 의해 선택될 것으로 예상되는 레코드 비율을 말한다.
  • 카디널리티(Cardinality) 는 특정 액세스 단계를 거치고 나서 출력될 것으로 예상되는 결과 건수를 말하며,
    총 로우 수에 선택도를 곱해서 구한다.
  • 칼럼 히스토그램 정보를 이용하면 더 정확하게 카디널리티를 구할 수 있으며, 특히 분포가 균일하지 않은 칼럼 조건을 분석할 때 유용하다.

제2절 쿼리변환

  • 쿼리 변환 (Query Transformation) 은, 옵티마이저가 SQL을 분석해 의미적으로 동일하면서도 더 나은 성능이 기대되는 형태로 재작성하는 것을 말한다.
  • 서브쿼리 Unnesting : 중첩된 서브쿼리를 풀어내는 쿼리변환. 서브쿼리를 메인쿼리와 같은 레벨로 풀어내면 다양한 액세스 경로와 조인 메소드를 평가할 수 있다.
  • 뷰 Merging : 뷰를 참조하는 쿼리 블록의 조건절을 뷰 쿼리 블록 안으로 밀어넣는 쿼리변환
  • 조건절 이행 : (A=B) 이고 (B=C) 이면 (A=C) 이다. 라는 추론을 통해 새로운 조건절을 내부적으로 생성해 주는 쿼리변환
  • 그 외에도 불필요한 조인 제거, OR 조건을 Unioin 으로 변환, 집합연산을 조인으로 변환하는 등 내부적으로 다양한 쿼리변환이 일어난다.