컴퓨터일반/DB

[Oracle]오라클 대용량 데이터 페이징 처리 완벽 가이드

G-Ryon 2026. 3. 26. 13:45

대용량 테이블에서 단순히 SELECT를 수행하면 전체 데이터를 읽어오느라 성능이 급격히 저하됩니다.

사용자가 필요한 범위만큼만 데이터를 끊어서 가져오는 효율적인 페이징 기법 3가지를 소개합니다.

1. ROWNUM과 인라인 뷰를 이용한 전통적 방식 (Oracle 11g 이전)

오라클 11g 이하 버전에서 가장 많이 사용되던 방식입니다.

ROWNUM은 행이 추출되는 순서대로 번호를 부여하는 가상 컬럼입니다.

  • 구현 원리: 정렬된 서브쿼리(인라인 뷰)를 먼저 실행한 후, ROWNUM으로 범위를 지정합니다.
  • 특징: 반드시 2중 중첩 구조를 사용해야 합니다. WHERE ROWNUM > 10과 같은 조건은 첫 번째 행부터 체크하기 때문에 직접 사용하면 결과가 나오지 않기 때문입니다.
SQL
 
SELECT * FROM (
    SELECT a.*, ROWNUM rnum FROM (
        SELECT * FROM employees ORDER BY hire_date DESC
    ) a WHERE ROWNUM <= 20 -- 종료 범위
) WHERE rnum > 10; -- 시작 범위

2. ROW_NUMBER() 윈도우 함수 활용

ROW_NUMBER() 함수를 사용하면 ORDER BY와 번호 매기기를 한 번에 처리할 수 있어 쿼리 가독성이 좋아집니다.

  • 장점: 정렬 기준이 복잡할 때 유용하며, 문법이 비교적 직관적입니다.
  • 성능: ROWNUM 방식과 성능 면에서 큰 차이는 없으나, 대량의 정렬 작업 시 리소스를 고려해야 합니다.
SQL
 
SELECT * FROM (
    SELECT e.*, ROW_NUMBER() OVER (ORDER BY hire_date DESC) as rnum
    FROM employees e
) WHERE rnum BETWEEN 11 AND 20;

3. OFFSET FETCH 구문 (Oracle 12c 이후 권장)

ANSI SQL 표준을 따르는 방식으로, 오라클 12c 버전부터 도입되었습니다. 가장 간결하고 가독성이 뛰어난 최신 방식입니다.

  • 장점: 별도의 서브쿼리나 가상 컬럼 없이 ORDER BY 절 뒤에 바로 붙여 사용합니다.
  • 단점: 내부적으로는 여전히 윈도우 함수 형태로 변환되어 실행되므로, 인덱스 최적화가 안 되어 있다면 성능 이슈가 발생할 수 있습니다.
SQL
 
SELECT * FROM employees
ORDER BY hire_date DESC
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

🚀 성능 최적화를 위한 핵심 팁 (Performance Tuning)

대용량 데이터 페이징에서 가장 중요한 것은 '어떻게 정렬을 회피하고 인덱스를 활용하느냐' 입니다.

  1. 인덱스 활용 (Index Range Scan):
  2. 정렬(ORDER BY)에 사용되는 컬럼에 인덱스가 생성되어 있어야 합니다.
    인덱스는 이미 정렬된 상태이므로, DB가 별도의 정렬 작업(Sort) 없이 데이터를 바로 읽어올 수 있습니다.
  3. STOP KEY 알고리즘:
  4. 오라클은 ROWNUM 조건을 만나면 해당 건수만큼만 데이터를 읽고 스캔을 멈춥니다.
    이를 활용해 불필요한 전체 스캔을 방지해야 합니다.
  5. SELECT 리스트 최적화:
  6. SELECT * 보다는 필요한 컬럼만 명시하여 데이터 운반 부하를 줄이세요.

요약 및 결론

방식 추천 버전 가독성 특징
ROWNUM 모든 버전 보통 가장 빠르고 표준적인 성능 보장
ROW_NUMBER() 10g 이상 좋음 분석 함수 활용 가능, 코드 깔끔함
OFFSET FETCH 12c 이상 매우 좋음 최신 표준 문법, 유지보수 용이

대용량 서비스라면 인덱스 설계를 먼저 점검한 후, 프로젝트 환경에 맞는 방식을 선택하시기 바랍니다.


Copyright 2026. [버미] all rights reserved.