본문 바로가기

Oracle DB

옵티마이저 원리

1) 옵티마이저 소개

(가) 옵티마이저란?

- 쿼리 실행을 위해 후보군이 될 실행 계획을 찾는다

- 오브젝트 통계 및 시스템 통계 정보를 이용해 실행 계획의 예상비용 산정

- 각 실행 계획을 비교하여 최저 비용의 실행 계획 선택

 

 

(나) 옵티마이저 종류

- 옵티마이저 종류로는 규칙 / 비용 기반 옵티마이저가 있다

- 규칙기반 옵티마이저 : 미리 정해 높은 규칙에 따라 액세스 경로 평가 및 실행계획 선택

- 비용기반 옵티마이저 : 쿼리를 수행하는데 소요되는 일량 또는 시간을 비용으로 산정

-> 비용은 테이블, 인덱스에 대한 통계 정보를 기초하여 산정

 

 

(다) SQL 최적화 과정

PARSER(문법, 의미 오류 체크) -> OPTIMIZER (QUERY TRANSFORMER-표준 형태로, ESTIMATOR –통계 정보를 이용해 총 비용 계산, PLAN GENERATOR) -> ROW-SOURCE GENERATOR(엔진이 실제 실행할 수 있는 코드 형태) -> SQL ENGINE (실행)

 

 

(라) 최적화 목표

- 전체 처리속도 최적화 : ALL_ROWS(전체 다), FIRST_ROWS(일부만 읽고 끝), CHOOSE (옵티마이저가 선택) 등의 방법을 통해 힌트를 줌. ALL_ROWS가 기본 전제로 실행계획을 선택함

- 최초 응답속도 최적화 : ALL_ROWS가 아닌 FIRST_ROWS를 통해 일부만 읽다 멈추는 것을 전제로 실행계획 수립

 

 

2) 옵티마이저 행동에 영향을 미치는 요소

가) SQL 연산자 형태 : 연산자나 형태를 어떤걸 사용했는지에 따라 실행계획이 달라짐

나) 옵티마이징 팩터 : 인덱스, IOT, C.F, 파티셔닝, MV 구성에 따라 변경

다) DBMS 제약 설정 : PK, FK, NOT NULL, CHECK 등은 성능 최적화에 매우 중요한 요소

라) 옵티마이저 힌트 마) 통계정보 바) 옵티마이저 관련 파라미터 사) DBMS 버전과 종류

 

 

3. 옵티마이저의 한계

가) 옵티마이징 팩터의 부족 : 효과적 인덱스, IOT, 클러스터링, 파티셔닝 등의 팩터제공 필요

나) 통계정보의 부정확성

다) 바인드 변수 사용 시 균등분포 가정 -> OPTIC_BIND_PEAK 변수 사용

라) 비현실적인 가정

마) 규칙에 의존하는 CBO : 부분적으로 규칙에 의존

바) 하드웨어 성능 특성 -> 실제 운영하는 환경이랑 다름!. 시스템 통계정보 필요!

 

 

4. 통계정보를 이용한 비용 계산 원리

가) 선택도 : 1/DISTINCT

나) 카디널리티 : 총 로우수 x 선택도 = 총 로우수 / DISTINCT VALUE 수

다) 히스토그램 : DISTINCT가 적을 땐 도수분포, 많을 땐 높이균형 히스토그램

라) 비용 : CBO는 비용기반으로 최적화 수행. 비용은 쿼리를 수행하는 일량 또는 시간으로 예상치. I/O(블락을 몇 개 읽는지), CPU, CHOOSE(시스템통계 있을 시 cpu모델. 없을시 I/O) 비용 모델 등이 있다.

 

 

5. 옵티마이저 힌트

가) 힌트가 무시되는 경우

- 문법/의미적으로 안 맞게 기술한 힌트

*의미적으로 안 맞는 다는 건 서브쿼리에 unnest와 subq를 같이 기술한 경우 등을 말함

- 잘못된 참조 사용 : 없는 테이블이나 Alias 사용. 없는 인덱스명을 지정

- 논리적으로 불가능한 액세스 경로 : 등치 조건이 없는데 해쉬 조인 유도, NULL이 허용된 칼럼에 대해 인덱스를 이용 전체 건수 count 등

- 버그 : 위 5가지 조건에 해당하지 않으면 무조건 수행되며 사용자 명령어로 인식. SQL 서버의 경우 힌트에서 사용한 인덱스를 삭제하였을 경우 에러(안정성은 낮으나 DBA 조정가능), Oracle은 그냥 수행(안정성은 높으나 성능의 문제)

 

'Oracle DB' 카테고리의 다른 글

인덱스 구조 및 종류의 이해(1)  (0) 2021.04.03
SQL 파싱 부하  (0) 2021.04.03
튜닝 기본 원칙  (0) 2021.04.03
아키텍처 기반 튜닝 원리  (0) 2021.04.03
네트워크에서의 대기 이벤트들  (0) 2021.04.03