SQL 성능 튜닝 시 쿼리 실행 계획의 목적을

"빠르게 첫 행을 보여줄 것인가?"
"전체 처리량을 최적화할 것인가?"
에 따라 달리 선택할 수 있습니다.

Oracle에서는 이런 목적을 힌트로 지정할 수 있는데,
그게 바로 결과 제어 힌트 (Optimization Goal Hints)입니다.

이 글에서는
✅ FIRST_ROWS와 ALL_ROWS 힌트의 차이,
✅ 각 힌트가 성능에 미치는 영향,
✅ 어떤 상황에서 어떤 힌트를 써야 할지
명확하게 정리해드립니다.


🔍 결과 제어 힌트란?

오라클 옵티마이저에게 “쿼리를 어떤 방식으로 최적화할지” 지시하는 힌트입니다.


옵티마이저는 기본적으로 처리량 중심(ALL_ROWS) 으로 쿼리를 실행합니다.
하지만 사용자가 결과를 빠르게 보길 원하는 경우에는
👉 첫 행 응답 속도 중심으로 계획을 바꿔줄 수 있습니다.


🧠 대표 결과 제어 힌트 2종

1. ⚡ FIRST_ROWS(n) — 첫 번째 결과를 빠르게

SELECT /*+ FIRST_ROWS(1) */ * 
  FROM emp WHERE deptno = 10;


  • 설명: 쿼리의 첫 번째 결과 행을 빠르게 반환하는 실행 계획 선택
  • 옵션: FIRST_ROWS, FIRST_ROWS(1), FIRST_ROWS(10) 등 n 지정 가능
  • 적용 예시:
    • 페이지네이션 (ROWNUM <= 10)
    • 화면 UI에 빠르게 결과를 보여줘야 할 때
  • 장점:
    • 빠른 사용자 응답
    • OLTP(온라인 트랜잭션) 시스템에 적합

✅ 예

SELECT /*+ FIRST_ROWS(10) */ * 
  FROM emp 
 WHERE deptno = 30 AND ROWNUM <= 10;



2. 📦 ALL_ROWS — 전체 처리량 최적화

SELECT /*+ ALL_ROWS */ * FROM emp WHERE deptno = 10;



  • 설명: 전체 결과를 가장 효율적으로 처리하는 실행 계획 선택
  • 적용 예시:
    • 대용량 배치 작업
    • 보고서, 통계 등 전 결과를 모두 다룰 때
  • 장점:
    • CPU 효율적 사용
    • 대규모 연산/조인 처리에 적합
  • 기본 설정: Oracle 옵티마이저는 기본적으로 ALL_ROWS 전략을 사용

✅ 예

SELECT /*+ ALL_ROWS */ COUNT(*) FROM sales 
 WHERE sale_date BETWEEN SYSDATE - 30 AND SYSDATE;


🔄 FIRST_ROWS vs ALL_ROWS 비교

구분FIRST_ROWS(n)ALL_ROWS
🎯 목표빠른 첫 행 반환전체 처리 효율
🧠 전략인덱스 사용 우선전체 스캔, 병렬 처리 우선
⚡ 적용 예화면 출력, 페이징배치, 통계, 리포트
💡 시스템OLTPDSS / OLAP

⚠️ 주의사항

  • FIRST_ROWS는 인덱스 기반 실행 계획을 유도하므로
    → 통계 정보가 부정확하거나 인덱스가 불완전하면 비효율 가능성 있음
  • FIRST_ROWS(1) 과 ROWNUM <= 1 조합이 없으면 의미가 약해질 수 있음
  • 병렬 처리 + 결과 제어 힌트 같이 사용할 경우에는 충돌 가능성도 고려

🔍 실행 계획 확인

EXPLAIN PLAN FOR
SELECT /*+ FIRST_ROWS(1) */ * FROM emp WHERE deptno = 10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);


실제로 옵티마이저가 어떤 방식으로 실행 계획을 짰는지 반드시 확인하세요.


🏁 마무리 요약

상황추천 힌트
UI에서 빠른 응답 필요FIRST_ROWS(n)
전체 데이터 처리/집계ALL_ROWS
배치 프로그램ALL_ROWS
웹 페이지 조회 목록FIRST_ROWS(10) 등