본문으로 건너뛰기
SQLD 준비실
이론 전체 목차 열기 26 / 32

SQL 고급활용 및 튜닝 · 옵티마이저 26 / 32

SQL 옵티마이저

옵티마이저가 실행 계획을 선택하는 방식과 통계 정보, 힌트, 비용 기반 판단의 한계를 정리합니다.

출제 빈도 ★★★☆☆ 관련 문제 3개 | CBO통계Cost

옵티마이저란

옵티마이저는 SQL을 어떤 순서와 방법으로 실행할지 결정하는 DBMS의 핵심 구성요소입니다. 사용자는 원하는 결과를 SQL로 선언하고, 옵티마이저는 그 결과를 얻는 방법을 고릅니다.

SELECT e.ename, d.dname
FROM emp e
JOIN dept d ON d.deptno = e.deptno
WHERE e.sal >= 3000;

이 SQL에 대해 옵티마이저는 emp를 먼저 읽을지, dept를 먼저 읽을지, 인덱스를 사용할지, 어떤 조인 방식을 쓸지 결정합니다.

규칙 기반과 비용 기반

방식의미
규칙 기반정해진 우선순위 규칙으로 실행 방법 선택
비용 기반통계 정보를 이용해 예상 비용이 낮은 계획 선택

현대 DBMS는 대부분 비용 기반 옵티마이저를 사용합니다. 비용 기반에서는 통계 정보가 매우 중요합니다.

통계 정보

통계 정보는 테이블과 인덱스의 데이터 분포를 요약한 정보입니다.

  • 테이블 행 수
  • 블록 수
  • 컬럼의 값 종류 수
  • NULL 개수
  • 값 분포
  • 인덱스 높이와 선택도

통계가 오래되었거나 실제 데이터 분포를 잘 반영하지 못하면 옵티마이저가 잘못된 계획을 고를 수 있습니다.

카디널리티와 선택도

카디널리티는 조건을 적용한 뒤 예상되는 행 수입니다. 선택도는 전체 중 얼마나 선택되는지를 나타내는 비율입니다.

WHERE empno = 7788

이 조건은 보통 한 행만 선택하므로 카디널리티가 작고 선택도가 높습니다.

WHERE gender = 'M'

이 조건은 전체의 상당 부분을 선택할 수 있으므로 단독 인덱스 효과가 제한적일 수 있습니다.

힌트

힌트는 옵티마이저에게 실행 계획 방향을 제안하는 문법입니다.

SELECT /*+ USE_NL(e d) */ e.ename, d.dname
FROM emp e
JOIN dept d ON d.deptno = e.deptno;

힌트는 강력하지만 남용하면 영향이 큽니다. 데이터 양이나 분포가 바뀌었는데 힌트가 고정되어 있으면 오히려 나쁜 계획을 강제할 수 있습니다.

옵티마이저 문제를 의심할 때

  • 예상 행 수와 실제 행 수가 크게 다릅니다.
  • 작은 결과라고 예상하고 NL 조인을 골랐는데 실제 결과가 매우 큽니다.
  • 인덱스가 있는데도 전체 스캔을 선택했습니다.
  • 반대로 전체 스캔이 나을 상황인데 인덱스 반복 접근을 합니다.

한 문장 요약

옵티마이저는 통계로 비용을 예측해 실행 계획을 고르며, 통계가 틀리면 계획도 틀릴 수 있습니다.