Computer Science/DB
Oracle offset (오라클 페이징 처리)
컴슈터
2022. 10. 5. 22:55
이번 프로젝트에서 SQL 튜닝 가이드를 받아 쿼리를 수정하면서 offset 키워드를 알게 되어 포스팅한다. 오라클은 12c 버전부터 offset과 limit가 추가되었다.
Oracle 12c 이전
Oracle 12c 이전에는 ROW_NUM을 사용하여 페이징 처리를 했다. 단점은 쿼리를 view로 감싸므로 쿼리가 복잡해진다.
SELECT *
FROM (
SELECT a.*, ROWNUM AS "ROWNUM"
FROM (
사용자 정의 쿼리 QUERY
) a
WHERE ROWNUM <= end_number
) a
WHERE rnum >= start_number
Oracle 12c 이후
Oracle 12c 이후부터는 행 제한(row limitng)을 이용하여 간단하게 페이징 처리할 수 있다. 오라클의 지저분한 페이징 처리를 간결하게 할 수 있는 장점이 있다.
- offset : 건너뛸 행의 수를 지정
- fetch : 반환할 행의 수를 지정
SELECT *
FROM table_name
ORDER BY column_name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
실제 활용 사례 1
SELECT *
FROM table_name
ORDER BY column_name
OFFSET (pageNbr-1)*pageCnt ROWS FETCH NEXT pageCnt ROWS ONLY;
--OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY; -- 1페이지 : 0개 행 건너뛰고 10개의 행 반환(pageNbr:1, pageCnt:10)
--OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; -- 2페이지 : 10개 행 건너뛰고 10개의 행 반환(pageNbr:2, pageCnt:10)
--OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; -- 3페이지 : 20개 행 건너뛰고 10개의 행 반환(pageNbr:3, pageCnt:10)
실제 활용 사례 2
Pageable를 이용하여 페이징 구현시 아래처럼 offset, pageSize를 이용하여 구현할 수도 있다.
SELECT *
FROM table_name
ORDER BY column_name
OFFSET #{offset} ROWS FETCH NEXT #{pageSize} ROWS ONLY;