중급Oracle 전용

옵티마이저 (Optimizer)

SQL을 어떤 순서로 어떻게 실행할지 결정하는 데이터베이스의 엔진

정의

SQL을 받으면 옵티마이저가 "이걸 어떻게 실행하면 가장 빠를까"를 계산해 실행계획을 만든다. 같은 결과를 내는 SQL이라도 처리 방식은 여러 가지가 있는데(인덱스를 쓸지, 어떤 조인 방식을 쓸지, 어느 테이블을 먼저 읽을지 등), 그중 가장 비용이 적게 드는 방식을 옵티마이저가 선택한다. 오라클은 비용 기반 옵티마이저(CBO, Cost-Based Optimizer)를 사용하며, 통계 정보를 기반으로 비용을 추정한다.

왜 중요한가?

SQL 튜닝은 결국 옵티마이저가 좋은 실행계획을 고르도록 돕는 일. 통계가 부정확하거나, 컬럼에 함수를 씌우거나, 데이터 분포가 편향되면 옵티마이저가 잘못된 계획을 선택해 SQL이 느려진다. 통계 정보 갱신과 SARGable 조건 작성이 옵티마이저를 돕는 기본기.

틀리기 쉬운 포인트

  • !통계 정보가 오래되면 옵티마이저가 잘못된 계획을 선택할 수 있습니다.
  • !WHERE 컬럼에 함수를 씌우면 옵티마이저가 인덱스를 활용하지 못합니다.
  • !힌트 남용은 옵티마이저의 자율성을 깨뜨려 통계 변화에 적응하지 못하게 만듭니다.

예시

  -- 통계 정보 갱신 (테이블 단위) EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME'); -- 옵티마이저 모드 확인 SHOW PARAMETER optimizer_mode;

성능 포인트

!느린 SQL의 70% 이상은 옵티마이저가 실수해서 발생한다. 가장 흔한 원인은 통계 부정확. DBMS_STATS로 정기 갱신하라.

관련 개념

관련 문제 풀어보기

관련 카테고리