Pagination

https://en.wikipedia.org/wiki/Select_(SQL)#Result_limits

 

12c 버전 이후라면? : Row Limiting Clause

 

12c 이전에는?

 

ROW_NUMBER() 사용한 방법

```sql

SELECT *

FROM (

    SELECT /*+ first_rows(25) */

        tid,

        ...etc fields,

        ROW_NUMBER() OVER (ORDER BY tid DESC) rn

    FROM

        trad

)

WHERE

    rn BETWEEN 25 AND 50

ORDER BY rn;

```

  • 안쪽 SELECT 에서 *을 쓰면 구문 오류가 발생하기 때문에, 필요한 컬럼을 명시해준다.
  • /*+ 주석은 Oracle Hint로, 같이 넣어준다.
  • Offset Method(rownum을 사용하는 방식)와 성능상 차이는 없어보이고, 다만 그 방법은 두 단계의 inline view를 사용해야 해서 가독성이 좀 떨어지기 때문에 요게 더 낫긴 하다.
    • 둘 다 index full scan이 뜬다.
  • 이미 조회가 끝난 앞쪽 부분에 row가 추가 되었을 때, 전체적으로 1개 만큼 밀리게 되므로 이전 페이지에서 보였던 마지막 항목이 다음 페이지 처음에 또 보일 수 있음.

 

이전 결과의 마지막 항목을 기준으로 그 다음부터 찾아나가는 방법

  • Index range scan이 뜨며 인라인 뷰를 사용하지 않기 때문에 싱글 스레드로 조회 시 성능이 가장 좋음
  • 이미 조회가 끝난 앞쪽 부분에 row가 추가 되었을 때, 문제 없음. (이전 결과 기준 n개의 다음 항목 조회이므로)
  • 병렬 조회가 불가능하다는 것이 제일 큰 단점
  • 조회 조건으로 거는 컬럼이 Unique 해야 한다는 제약도 있음.

'Data Store' 카테고리의 다른 글

카프카 컨슈머  (0) 2021.07.23
docker 안의 DB를 사용할 때 timezone 문제  (0) 2021.05.19
[Oracle] Pagination  (0) 2021.05.17
Flyway  (0) 2021.05.13
[Oracle] longest match  (0) 2021.02.16
DB 이중화 / 클러스터링  (0) 2020.09.23