2022-10-05
작성
이번 프로젝트에서 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;
'Computer Science > DB' 카테고리의 다른 글
[Mybatis] 오라클 DB insert 이후 idx 값 가져오기 (nextVal, currVal) (0) | 2023.11.22 |
---|---|
H2-console에서 Localhost에서 연결을 거부했습니다. 오류 발생시 해결법 (1) | 2023.11.20 |
H2 console 접속 오류 해결법 : Database "C:/Users/사용자명/test" not found, either pre-creat (0) | 2023.10.14 |
한눈에 파악하는 SQL 로드맵 (0) | 2023.09.13 |