새소식

CS/데이터베이스

pagination - offset vs cursor

  • -

페이지 처리를 하는 데에는 두 가지 방식이 있다. offset방식과 cursor방식이다.

 

1. OFFSET(오프셋) 방식

OFFSET 방식에서 가장 중요한 점은 뒷부분 데이터를 조회할 수록 느려진다는 점이다. 오프셋 쿼리는 아래와 같다.

SELECT * FROM [TABLE] [조건절] LIMIT [페이지 당 글 수] OFFSET [오프셋]

 

이때, 항상 모두 조회를 하고 오프셋에 따라 결과를 잘라 데이터를 보내는 방식으로 작동한다. 데이터가 달라질 수 있기 때문에 매번 처음부터 조회를 하는 것이다. 때문에, 오프셋 방식은 뒷부분 데이터를 조회할 수록 성능이 아주 느려진다.

 

또 다른 단점은 사용자 관점에서 데이터의 누락과 중복이 종종 일어난다는 점이다. 예를 들어 테이블이 아래와 같다고 하고, 첫번째 페이지에 1, 2번 row를 뽑았다고 하자

 

이때 1번과 2번 row 사이에 데이터가 추가된다면, 아래 처럼 2번 row가 다시 한 번 중복되어 조회된다. 마찬가지로 1번 row나 2번 row가 삭제된다면 어떨까? 3번 row가 누락되는 현상이 발생한다.

이처럼, offset 방식은 정적 데이터를 사용하는 데에 적합하다. 자주 삽입, 삭제가 이루어지면 사용자 관점에서 데이터의 누락이나 중복이 발생할 확률이 높아지기 때문이다.

 

2. CURSOR(커서) 방식

cursor란 어떤 레코드를 가르키는 포인터(pointer)이다. 이 cursor가 가르키는 레코드로부터 일정 갯수만큼만 가져오는 방식이다.

# 최초 조회
SELECT * FROM [TABLE] [조건절] LIMIT (페이지 당 숫자)

# 다음 페이지부터
SELECT * FROM [TABLE] WHERE [기존 조건절] AND [커서 칼럼] > [직전 값] LIMIT (페이지 당 숫자)

 쿼리에서 알 수 있듯, 커서 방식은 처음부터 조회하지 않고, 직전 값 이후부터 그냥 읽어온다. 때문에, 오프셋 방식과 달리 뒤로 갈 수록 속도가 느려지지도 않으며, 데이터의 누락과 삭제가 발생하지 않는다. 하지만 커서 방식은 쿼리 작성시 유의해야할 점이 있다. 커서 칼럼들 중 하나는 무조건 유니크한 값을 가지는 칼럼으로 설정해야한다는 것이다. 그렇게 하지 않으면 데이터가 누락되는 경우가 생긴다. 부등호를 이용한다고 하더라도 동일한 값 안에서 정렬이 모호해지는 지점이 생기기 때문에 데이터의 일관성을 유지하기 위해 유니크한 값을 커서칼럼으로 지정해야한다.

 

 

출처

https://betterdev.tistory.com/17

https://velog.io/@pjh612/Offset-Paging-vs-Cursor-Paging

'CS > 데이터베이스' 카테고리의 다른 글

[ORACLE] 문자열 패턴 검색  (0) 2024.05.08
[ORACLE] SQL 작성 순서와 작동 순서  (0) 2024.05.08
[ORACLE] group by  (0) 2024.05.08
[ORACLE] limit 사용하는 방법  (0) 2024.05.07
트랜잭션(Transaction)  (0) 2022.09.13
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.