목록으로
'언젠가 읽기' 컨텐츠는 논문이나 영문 컨텐츠 등 언젠가 읽으려고 즐겨찾기 하고선
읽지 않고 계속 미룰만한 컨텐츠를 읽고 요약하거나 소개합니다.
Postgres 페이징을 위한 오프셋이 아닌 키셋 커서
소개
Sequin은 Kafka, SQS, HTTP 엔드포인트 등과 같은 스트림과 큐로 데이터를 전송하는 Postgres CDC(변경 데이터 캡처) 도구입니다. 효율적이고 정확한 페이지네이션은 백필(backfill) 프로세스에서 매우 중요하기 때문에, Sequin은 키셋 커서를 광범위하게 사용합니다.
Offset/Limt 페이지네이션의 한계
Postgres에서 offset/limit을 사용하는 페이지네이션 방식에는 두 가지 주요 문제가 있습니다:
-
성능 문제 : offset 값이 증가할수록 쿼리 시간이 선형적으로 증가합니다. 이는 Postgres가 offset에 지정된 행을 건너뛰더라도 실제로는 해당 행을 모두 순회해야 하기 때문입니다.
-
정확성 문제 : 테이블에서 행이 삭제되거나 변경될 경우, offset 페이지네이션은 일부 행이 누락되거나 중복될 수 있습니다. 예를 들어, 사용자가 페이지를 이동하는 도중에 행이 삭제되면, 사용자는 특정 행을 보지 못하게 될 수 있습니다.
성능 문제 자세히
offset 페이지네이션을 사용할 때, offset 값이 커질수록 쿼리의 응답 시간이 증가합니다. 예를 들어, offset이 1000인 경우에도 Postgres는 처음 1000개의 행을 모두 읽어야 하므로, 페이지가 깊어질수록 성능이 저하됩니다.
정확성 문제 자세히
행이 삭제되거나 업데이트될 경우, offset 페이지네이션은 이전에 봤던 행의 위치가 변경되어 사용자가 특정 행을 보지 못하게 만들 수 있습니다. 이는 데이터의 일관성을 해칠 수 있습니다.
키셋 페이지네이션
키셋 페이지네이션은 offset 대신 커서(예: updated_at과 id의 조합)를 사용하여 다음 페이지의 시작점을 지정합니다. 이는 다음과 같은 장점을 가집니다:
-
향상된 성능 : offset을 사용할 때와 달리, 키셋 페이지네이션은 필요한 행만 정확히 조회하므로 성능이 일정하게 유지됩니다.
-
높은 정확성 : 커서를 사용함으로써 데이터의 삽입이나 삭제가 페이지네이션 결과에 영향을 미치지 않아, 일관된 데이터를 제공합니다.
복합 커서의 이점
복합 커서를 사용하면 테이블의 "전체 정렬 순서"를 생성할 수 있습니다. 이는 다음과 같은 속성을 보장합니다:
-
고유한 위치 지정 : 모든 행은 정렬 순서 내에서 고유한 위치를 가집니다.
-
변경 시 일관성 유지 : 행의 정렬 필드가 변경되지 않는 한, 행의 위치는 변하지 않습니다.
-
삽입 및 삭제에 강함 : 다른 행의 삽입이나 삭제가 페이지네이션 결과에 영향을 주지 않습니다.
함께 읽으면 좋은 참고 자료
-
"The Perils of Offset Pagination"
-
"Efficient Pagination Strategies for Large Datasets"
-
"Understanding Cursor-Based Pagination"
푸딩캠프 뉴스레터를 구독하면 학습과 성장, 기술에 관해 요약된 컨텐츠를 매주 편하게 받아보실 수 있습니다.