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 |
🎯 목표 | 빠른 첫 행 반환 | 전체 처리 효율 |
🧠 전략 | 인덱스 사용 우선 | 전체 스캔, 병렬 처리 우선 |
⚡ 적용 예 | 화면 출력, 페이징 | 배치, 통계, 리포트 |
💡 시스템 | OLTP | DSS / 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) 등 |