TECH/sql

[Oracle] 옵티마이저는 완벽하지 않다! SQL 힌트(Hint)로 실행 계획 제어하기

런코리치 2026. 3. 2. 08:00

데이터베이스의 두뇌인 옵티마이저(Optimizer)는 통계 정보를 바탕으로 최적의 길을 찾아줍니다. 하지만 때로는 낡은 통계 정보나 복잡한 조인 구조 때문에 멍청한 길(Full Table Scan 등)을 선택하기도 하죠. 이때 개발자가 "이 길로 가!"라고 명시적으로 지시하는 명령어가 바로 힌트(Hint)입니다.


1. 힌트(Hint)란 무엇인가?

힌트는 SQL 문장에 포함되어 옵티마이저에게 전달되는 주석 형태의 명령입니다. 옵티마이저는 힌트가 있으면 자신의 판단보다 힌트의 지시를 우선순위로 두어 실행 계획을 수립합니다.

✍️ 기본 문법

SQL
SELECT /*+ HINT_NAME(ARGUMENTS) */ column1, column2 FROM table_name;
  • 주석 기호(/* ... */) 안에 **플러스 기호(+)**를 붙여야 힌트로 인식됩니다.
  • 힌트 명이나 인자(테이블 명 등)에 오타가 있으면 옵티마이저는 이를 무시하고 일반 주석으로 처리해 버리니 주의해야 합니다.

2. 실무에서 가장 많이 쓰는 핵심 힌트 TOP 3

① 최적화 목표 변경: /*+ ALL_ROWS */ vs /*+ FIRST_ROWS */

  • ALL_ROWS: 전체 결과가 나올 때까지의 총 비용을 최소화합니다. (주로 배치 작업, 통계 리포트)
  • FIRST_ROWS: 첫 번째 행이 나올 때까지의 응답 시간을 최소화합니다. (주로 사용자 웹 화면 조회)

② 인덱스 제어: /*+ INDEX(TABLE_NAME INDEX_NAME) */

가장 많이 쓰이는 힌트입니다. 옵티마이저가 인덱스를 안 타고 전체 스캔을 할 때 특정 인덱스를 타도록 강제합니다.

  • 예시:
SQL
SELECT /*+ INDEX(e EMP_PK) */ ename FROM emp e WHERE empno > 0;

③ 조인 순서 및 방식 제어: /*+ LEADING */, /*+ USE_HASH */

조인 순서는 성능에 막대한 영향을 미칩니다. 작은 테이블을 먼저 읽도록 하거나, 특정 조인 알고리즘을 강제할 때 씁니다.

  • 예시:
SQL
SELECT /*+ LEADING(d e) USE_HASH(e) */ *
FROM emp e, dept d
WHERE e.deptno = d.deptno;
  • 해석: dept(d) 테이블을 먼저 읽고(LEADING), emp(e)와 조인할 때는 Hash Join을 사용해라!

3. 왜 옵티마이저를 믿지 못하고 힌트를 쓸까?

힌트를 쓰는 가장 큰 이유는 '통계 정보의 불확실성' 때문입니다.

  1. 통계 정보가 최신이 아닐 때: 어제는 데이터가 10건이었는데 오늘 100만 건이 들어왔다면, 옵티마이저는 여전히 10건인 줄 알고 잘못된 판단을 내립니다.
  2. 데이터 분포가 고르지 않을 때: 특정 조건의 데이터가 전체의 90%를 차지하는 특수한 상황에서 옵티마이저가 헷갈릴 수 있습니다.
  3. 복잡한 쿼리: 조인되는 테이블이 10개가 넘어가면 옵티마이저가 모든 경로를 계산하는 데 한계가 있어 최적의 길을 놓치기도 합니다.

4. ⚠️ 힌트 사용 시 반드시 지켜야 할 주의사항

힌트는 매우 강력하지만, 양날의 검입니다.

  • 힌트는 최후의 수단입니다: 먼저 인덱스를 새로 만들거나 통계 정보를 갱신(DBMS_STATS)하여 옵티마이저가 스스로 길을 찾게 유도해야 합니다.
  • 데이터 변화에 취약함: 현재는 인덱스 스캔이 빨라서 힌트를 걸었지만, 나중에 데이터가 1,000배 늘어나서 전체 스캔이 더 유리해져도 힌트 때문에 인덱스를 고집하게 되어 시스템이 느려질 수 있습니다.
  • 오타 주의: 힌트는 틀려도 에러를 내지 않습니다. 그냥 무시될 뿐입니다. 반드시 적용 후 실행 계획을 확인해야 합니다.

🏁 마무리하며: "가이드는 하되, 맹신하지 마세요"

힌트는 숙련된 개발자가 시스템의 특성을 고려해 내리는 '긴급 처방'입니다. 힌트를 잘 쓰기 위해서는 앞서 포스팅한 '실행 계획 읽는 법'과 '조인 원리'에 대한 이해가 필수적입니다.

옵티마이저가 최선의 선택을 할 수 있도록 돕는 조력자로서 힌트를 활용해 보세요. 여러분의 SQL 성능이 한 단계 도약할 것입니다!

https://run-code-rich.tistory.com/entry/oracle-execution-plan-guide

 

[Oracle] 실행 계획(Execution Plan) 보는 법과 읽는 순서 완벽 정리

[Oracle] 내 SQL의 성능 진단서: 실행 계획(Execution Plan) 분석법SQL을 작성하고 결과가 나오기까지, 데이터베이스 내부에서는 수많은 연산이 일어납니다. 하지만 데이터 양이 수백만 건을 넘어가는 순

run-code-rich.tistory.com