[Oracle] Paging 처리하기
Oracle에서 효율적인 Paging 처리를 하는 방법에 대해 알아보도록 하겠습니다. 큰 데이터셋을 조회할 때, 페이지 단위로 데이터를 나누어 보여주는 것이 사용자 경험을 향상시키고, 서버 부하를 줄이는데 도움이 됩니다. 이번 글에서는 Oracle의 ROW_NUMBER(), RANK(), DENSE_RANK() 등의 윈도우 함수를 활용하여 페이징 처리를 하는 방법에 대해 소개하겠습니다.
1. ROW_NUMBER() 함수를 이용한 페이징 처리
ROW_NUMBER() 함수는 각 로우에 고유한 일련번호를 부여하는 윈도우 함수입니다. 이를 이용하여 페이징 처리를 할 수 있습니다. 아래의 예제 쿼리를 살펴보겠습니다.
SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY column_name) AS row_num,
column1,
column2,
...
FROM table_name
) temp_table
WHERE row_num BETWEEN start_row AND end_row;
위 쿼리에서는 먼저 ROW_NUMBER() 함수를 사용하여 각 로우에 일련번호를 부여한 후, 일련번호를 기준으로 페이지에 해당하는 로우만 조회합니다.
2. ROWNUM 을 이용한 페이징 처리
Oracle에서 ROWNUM 을 사용하여 페이징 처리를 할 수도 있습니다. 아래의 예제 쿼리를 참고하세요.
SELECT *
FROM (
SELECT temp_table.*, ROWNUM AS row_num
FROM (
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name
) temp_table
WHERE ROWNUM <= end_row
)
WHERE row_num >= start_row;
이 방법은 ROW_NUMBER() 함수를 사용하는 것과 비슷하게, 내부 서브쿼리에서 조회 결과에 ROWNUM 을 부여한 후, 외부 서브쿼리에서 ROWNUM 을 기준으로 페이지에 해당하는 로우만 조회합니다.
3. RANK(), DENSE_RANK()를 이용한 페이징 처리
RANK() 및 DENSE_RANK() 함수를 사용하여 페이징 처리를 할 수도 있습니다. RANK() 함수는 동일한 순위가 있는 경우, 다음 순위를 건너뛰고 부여하는 반면, DENSE_RANK() 함수는 동일한 순위가 있는 경우에도 건너뛰지 않고 순위를 부여합니다.
SELECT *
FROM (
SELECT
RANK() OVER (ORDER BY column_name) AS rank_num,
column1,
column2,
...
FROM table_name
) temp_table
WHERE rank_num BETWEEN start_row AND end_row;
위 쿼리에서는 먼저 RANK() 함수를 사용하여 각 로우에 순위를 부여한 후, 순위를 기준으로 페이지에 해당하는 로우만 조회합니다. DENSE_RANK() 함수를 사용하려면 RANK()를 DENSE_RANK()로 변경하기만 하면 됩니다.
4. OFFSET-FETCH 기능을 이용한 페이징 처리
Oracle 12c 이상에서는 OFFSET-FETCH 기능을 사용하여 페이징 처리를 할 수 있습니다. OFFSET-FETCH를 사용하면 쿼리가 더 간결해지고, 이해하기 쉬워집니다. 아래의 예제 쿼리를 참고하세요.
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name
OFFSET start_row - 1 ROWS
FETCH NEXT (end_row - start_row + 1) ROWS ONLY;
위 쿼리에서는 OFFSET 절에 시작 행을 지정하고, FETCH NEXT 절에 조회할 로우의 수를 지정하여 페이징 처리를 수행합니다.
5. 페이징 처리 성능 최적화
페이징 처리를 할 때, 성능 최적화를 고려해야 합니다. 특히, 대량의 데이터가 있는 테이블에서 페이징 처리를 할 때, 인덱스를 효율적으로 활용하여 성능을 개선할 수 있습니다. ORDER BY 절에 사용된 컬럼에 인덱스를 생성하면 조회 성능이 향상됩니다. 또한, WHERE 절의 조건에 따라 인덱스를 생성하거나, 테이블 파티셔닝을 고려할 수 있습니다.
이 글에서는 Oracle에서 효율적인 페이징 처리를 하는 방법에 대해 알아보았습니다. ROW_NUMBER(), RANK(), DENSE_RANK(), ROWNUM, 그리고 OFFSET-FETCH 기능을 사용하여 페이징 처리를 수행할 수 있습니다. 또한, 인덱스와 테이블 파티셔닝 등의 최적화 기법을 사용하여 페이징 처리 성능을 개선할 수 있습니다. 페이징 처리 방법과 최적화 기법을 적절히 활용하여 사용자 경험과 서버 부하를 최적화하는 애플리케이션을 구축하시길 바랍니다.