티스토리 뷰

DB

Oracle 페이지 처리

snail voyager 2020. 5. 26. 21:36
728x90
반응형

Offset-based Pagination

Oracle은 ROWNUM을 사용하여 페이지 처리
MySQL은 LIMIT를 사용하여 페이지 처리

ROWNUM, BETWEEN 사용 (1.3초)

  • 정렬은 인라인 뷰에서 먼저 처리
  • BETWEEN을 사용하면 전체 데이터에 ROWNUM을 처리해서 성능 이슈
select A.*, ROWNUM as RN
from (
    select *
    from TABLE
    order by 1
) A
where ROWNUM BETWEEN 11 AND 20;

ROWNUM, 페이지 수를 계산해서 사용 (1.3초)

select *
from (
  select A.*, CEIL(ROWNUM/10) as PAGE
  from (
      select *
      from TABLE
      order by 1
  ) A
)
where PAGE = 2;

ROW_NUMBER() 사용 (1.1초)

  • ROW_NUMBER()는 동일한 값이 존재해도 반드시 순위가 갈린다는 점
  • RANK()는 동일한 값이 있을 경우 같은 값 출력
select *
from (
    select A.*, ROW_NUMBER() OVER(ORDER BY ID DESC) as RN
    from TABLE A
)
where RN BETWEEN 11 AND 20;

ROWNUM 나눠서 사용 (0.8초)

  • ROWNUM 20번까지 붙이고 11번부터 조회
select *
from (
  select A.*, ROWNUM as RN
  from (
      select *
      from TABLE
      order by 1
  ) A
  where ROWNUM <= 20
)
where RN >= 11;

ROWNUM, Index Hint 사용 (0.6초)

select *
from (
  select /*+index_desc(A 인덱스명)*/ A.*, ROWNUM as RN
  from (
      select *
      from TABLE
      order by 1
  ) A
  where ROWNUM <= 20
)
where RN >= 11;

Cursor-based Pagination

https://velog.io/@minsangk/%EC%BB%A4%EC%84%9C-%EA%B8%B0%EB%B0%98-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%84%A4%EC%9D%B4%EC%85%98-Cursor-based-Pagination-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

728x90
반응형

'DB' 카테고리의 다른 글

ORACLE NCHAR vs NVARCHAR2  (0) 2021.10.07
Mybatis 글자수 4000bytes 이상 ora-01461 에러  (0) 2021.02.04
Oracle 특수문자 검색  (0) 2020.05.25
Oracle vs MySQL  (0) 2019.07.14
Data Mart  (0) 2016.05.08
반응형
300x250