Oracle OFFSET 성능 최적화와 Keyset 페이징
OFFSET은 데이터가 많아질수록 성능이 급격히 떨어집니다. 대용량 환경에서는 Keyset Pagination(Seek 방식)을 사용하고, 정렬 컬럼에 적절한 인덱스를 추가하는 것이 가장 효과적인 방법입니다.
OFFSET 성능 문제
- OFFSET-FETCH 방식은 지정된 OFFSET만큼 데이터를 건너뛰기 위해 정렬 후 스캔을 수행합니다.
- 데이터가 수백만 건 이상이면 TEMP 공간 사용과 CPU 부하가 급격히 증가합니다.
페이징 방식 비교
| 방식 | 장점 | 단점 | 성능 특성 |
|---|---|---|---|
| ROW_NUMBER | 정렬 순서 보장, 임의 페이지 접근 가능 | 전체 정렬 비용 발생 | 대량 데이터에서 성능 저하 |
| OFFSET-FETCH | SQL 문법 간결, 직관적 | OFFSET 커질수록 성능 급격히 저하 | 수백만 건 이상에서 비효율적 |
| Keyset Pagination | 불필요한 데이터 건너뛰지 않음, 일정한 성능 | 임의 페이지 접근 불가, 마지막 키 값 필요 | 대량 데이터에서도 안정적 |
Keyset 페이징 샘플 코드
1페이지 (처음 50개)
SELECT *
FROM orders
ORDER BY created_at, order_id
FETCH FIRST 50 ROWS ONLY;
2페이지 이후 (Seek 방식)
SELECT *
FROM orders
WHERE (created_at, order_id) > (:lastCreatedAt, :lastOrderId)
ORDER BY created_at, order_id
FETCH FIRST 50 ROWS ONLY;
100번째 페이지 접근
SELECT *
FROM orders
WHERE (created_at, order_id) > (:lastCreatedAt_99, :lastOrderId_99)
ORDER BY created_at, order_id
FETCH FIRST 50 ROWS ONLY;
운영 전략
- 순차 탐색: Keyset 본연의 방식, 성능 최적
- 중간 키 값 캐싱: 임의 페이지 접근 가능, 애플리케이션에서 관리 필요
- ROW_NUMBER 혼합: 특정 페이지 점프 가능, 대량 데이터에서는 성능 저하
결론
- 소규모 데이터(10만 건 이하) → OFFSET-FETCH도 실용적
- 대규모 데이터(100만 건 이상) → 반드시 Keyset Pagination + 인덱스 최적화
- 엑셀 다운로드, 로그 조회 등 대량 처리 → Keyset 방식이 안정성과 성능 모두 우수

