Pagination 의 경우 사용하는 DB에 따라 달라질 수 있다
일반적으로 SQL에서 사용하는 방식은 LIMIT과 OFFSET을 사용하여 특정 범위의 레코드를 조회하는 것이다.
- 각 페이지에 해당하는 데이터만을 가져와 효율적인 데이터 전송과 조회를 할 수 있습니다.
MySQL을 기준으로 작성한 쿼리 예시
SELECT *
FROM UESR
ORDER BY created_date DESC
LIMIT 10 OFFSET 0;
- LIMIT : 조회할 레코드 수를 지정
- OFFSET : 건너 뛸 레코드 수를 지정 OFFSET 0 은 첫번째 부터 시작
Pagination의 한계점 과 고려사항
- 큰 OFFSET 성능 문제 : 페이지 수가 증가할 수 록 성능 저하가 발생할 수 있습니다.
- 인덱스 기반 Pagination 이나, 커서 기반 방식으로 최적화 할 수 있습니다.
- 테이터 변경 가능성 : Pagination 이 적용된 데이터가 실시간으로 변경되는 환경에서는 정확한 페이징 결과가 나오지 않을 수 있습니다.
- 정확한 페이지 수 계산 : 전체 페이지 수를 계산하려면 count(*) 를 사용해 전체 레코드 수를 조회 한 후 페이지 크기를 나누는 방식이 필요합니다.
Oracle 에서의 페이지네이션
- Oracle에서는 OFFSET과 LIMIT을 지원하지 않으므로 ROWNUM 또는 FETCH FIRST를 사용해 구현합니다.
Oracle 12c 이상
SELECT *
FROM USERS
ORDER BY created_date DESC
OFFSET 20 ROW FETCH NEXT 10 ROWS ONLY;
- OFFSET 20 ROWS : 20개 행을 건너뜀
- FHTCH NEXT 10 ROWS ONLY : 그다음 10개 행을 가져옴
- 하지만 OFFSET.. FHTCH 의 기대 성능은 좋지 않아 대용량 서비스가 불가능하다.
Oracle 11g 이하
- RUMNUM을 이용해 Pagination을 구현할 수 있습니다.
SELECT EMPNO, ENAME, SAL
FROM
(
SELECT SEQ, EMPNO, ENAME, SAL
FROM
(
SELECT ROWNUM AS SEQ, EMPNO, ENAME, SAL
FROM
(
SELECT *
FROM EMP
ORDER BY SAL DESC
)
)
WHERE SEQ >= 6 -- START NO
)
WHERE ROWNUM <= 5; -- COUNT
- 내부를 정렬, START NO번째 데이터부터 보여지도록 감싼다.
- 보여질 게시글 갯 수만큼 지정한다.
'Database' 카테고리의 다른 글
[데이터베이스] B-Tree 인덱스와 B+Tree 인덱스 (0) | 2024.11.13 |
---|---|
[데이터베이스] 순차 I/O와 랜덤 I/O (2) | 2024.11.12 |
[데이터베이스] SQL 안티패턴 (2) | 2024.11.07 |
[데이터베이스]Table 용어 정리 (0) | 2024.10.28 |
[데이터베이스]DB와 DBMS 란? (1) | 2024.10.28 |