옵티마이저란
- 오라클은 10g 이후로 CBO만 지원함
규칙기반 옵티마이저
- 휴리스틱 옵티마이저
- OLTP 환경의 중소형 데이터베이스 시스템이라면 RBO 규칙이 어느 정도 보편 타당성을 갖는다.
그러나 RBO는 대용량 데이터를 처리하는데 있어 합리적이지 못할 때가 많다.
비용기반 옵티마이저
- 전통적인 I/O 비용 모델에서의 I/O 요청 횟수만으로 비용을 평가하지 않고,
CPU 연산 비용까지 감안하여 수행 일량을 상대적인 시간 개념으로 환산해서 비용을 평가
- CBO가 실행계획을 수립할 때 판단 기준이 되는 비용은 어디까지나 예상치
- 오브젝트 통계뿐만 아니라 하드웨어적 특성을 반영한 시스템 통계정보까지 이용
최적화 수행단계를 요약
● 사용자가 던진 쿼리수행을 위해 , 후보군이 될만한 실행계획을 찾는다.
● 데이터 딕셔너리에 미리 수집해 놓은 오브젝트 통계 및 시스템 통계정보를 이용해
각 실행계획의 예상비용을 산정한다.
● 각 실행계획의 비용을 비교해서 최저비용을 갖는 하나를 선택한다.
동적 샘플링
- 만약 테이블과 인덱스에 대한 통계정보가 없거나 너무 오래돼 신뢰할 수 없을 때 옵티마이저가
동적으로 샘플링을 수행하도록 할 수 있다.
- 통계 정보가 생성되지 않으면 하드 파싱 할때마다 동적 샘플링을 위한 recursive call 발생
( 성능이 좋지 못하다. )
CBO를 기준으로 SQL 처리 절차 요약
● Query Transformer
● Estimator
● Plan Generator
옵티마이저 모드
- rule
- all_rows
● DML 문자은 일부 데이터만 가공하고 멈출 수 없으므로 옵티마이저 모드에 상관없이
항상 all_rows 모드로 작동한다.
● Select 문장도 union, minus 같은 집합 연산자나 for update 절을 사용시
all_rows 모드로 작동
● PL/SQL 내에서 수행되는 SQL도 힌트를 사용하거나 기본 모드가 rule인 경우를 제외하면
항상 all_rows 모드로 작동
- first_rows
● first_rows는 비용과 규칙을 혼합한 형태의 옵티마이저 모드다.
● 얼마만큼 fetch 할지 지정하지 않았으므로 정확한 비용을 예측할 수 없고,
따라서 옵티마이저 내부적으로 정해진 규칙을 사용한다.
● first_rows는 이제 과거 버전과의 호환성을 위한 용도로만 남게 되었다.
- first_rows_n
● n으로 지정할 수 있는 값은 1, 10, 100, 1000 네 가지며, 사용자가 지정한 n개 로우이상을
Fetch 한다면 오히려 더 많은 리소스를 사용하고 전체 수행 속도도 느려질 수 있다.
(파라미터 사용 시 )
● 힌트를 사용할 때는 괄호 안에 () 보다 큰 어떤 정수 값이라도 입력 가능하므로
파라미터를 이용 할 때보다 더 정밀하게 제어할 수 있다.
● first_rows_n은 완전한 CBO 모드로 작동한다.
- choose
● 엑세스되는 테이블 중 적어도 하나에 통계정보가 있다면 CBO, 그중에서도 all_rows 모드를
선택한다.
● 9i 까지는 choose가 기본 설정이었으나 10g부터는 all_rows가 기본 옵티마이저 모드로
설정된다.
( 통계정보 없는 테이블을 발견하면 무조건 동적 샘플링이 일어나기 때문에
RBO로 작동할 일이 없어진 것이다. )
옵티마이저 모드 선택
- first_rows 모드가 효과적인 애플리케이션 아키텍처는 주로 2-Tier 환경의 클라이언트/서버 구조
이 애플리케이션 구조의 특징은 전체 결과집합이 아무리 많아도 사용자가 스크롤을 통해
일부만 Fetch하다가 멈춘다는 점이다. 결과집합을 끝까지 Fetch 하거나 다른 쿼리를 수행하기
전까지 SQL 커서는 오픈된 상태를 유지한다.
- OLTP성 애플리케이션이라도 3-Tier 구조는 클라이언트와 서버 간 연겨을 지속하지 않는
환경이므로 오프 커서를 계속 유지할 수 없어 페이지 처리 기법을 주로 사용한다.
이는 대량의 데이터에서 일부만 fetch 하다 멈추는 것이 아니라 집합 자체를 소량으로
정의한다는 것이다.
- 애플리케이션 특성상 확실히 first_rows가 적합하다는 판단이 서지 않는다면 all_rows를
기본 모드로 선택하고, 필요한 쿼리 또는 세션 레벨에서 first_rows 모드로 전환할 것을 권고
'ORACLE > SQLP' 카테고리의 다른 글
성능고도화 3-3. 옵티마이저의 한계 (0) | 2016.12.26 |
---|---|
성능고도화 3-2 옵티마이저 행동에 영향을 미치는 요소 (0) | 2016.12.26 |
성능도고화 2-8. 고급 조인 테크닉 (0) | 2016.12.26 |
성능고도화 2-7. 조인을 내포한 DML 튜닝 (0) | 2016.12.26 |
성능고도화 2-6. 스칼라 서브쿼리르 이용한 조인 (0) | 2016.12.26 |