본문 바로가기
Tibero

티베로 페이징 속도 최적화

by hs.park 2022. 8. 26.
select X.rnum, X.id, X.name, X.content, X.createdate

    from ( 

        select rownum as rnum, A.id, A.name, A.content, A.createdate

        from (

            select id, name, content, createdate

            from board

            order by createdate) A

        where rownum <= 30) X

    where X.rnum >= 21

[

    select X.rn, X.*
        from ( 
            select rownum as rn, A.*
                 from (
                     select *
                         from LETTNSAMPLEBOARD
                         order by ntt_no) A
                     where rownum <= (#recordCountPerPage# * #pageIndex#)) X
            where X.rn >= (#firstIndex#+1)

]

 DBMS 는 ROW NUMBER 을 부여하다가 위와 같이 첫번째 조건을 만족하게 되면 최적화를 통해 그 아래 데이터에 대한 정보 수집을 중지합니다. 그래서 30 개까지만 임시 테이블에 저장해둔 뒤 번호를 부여하고 나머지 값들은 버립니다. 그 뒤에 30개 안에서 앞의 20 개를 버리고 21 개째부터 나머지(=30)을 가져오기 때문에 속도가 빠릅니다.

즉, 총 게시물 수가 천만개라면, 정렬 후 천만개 모두를 번호를 매기면서 21 보다 같거나 크고 30 보다 작거나 같은 것을 찾는 것과 정렬 후 천만개 중 30 개까지 번호를 매긴 뒤 그걸 따로 떼서 21 보다 같거나 큰 것만 따로 떼서 사용자에게 제공하는 것의 차이가 발생하기 때문에 속도 차이가 눈에 띄게 나타납니다.

그래서, 만약 현재 자신이 사용중인 페이지 쿼리가 between 을 쓰고 있거나 한 번의 서브쿼리을 이용한 범위 검색을 쓰고 있다면, 두 번의 서브쿼리 형태로 바꾸시길 바랍니다.

추가로, 저번 글에서 말씀드렸던 부분인데...하나의 쿼리에서 총 게시물 수를 ROW_NUMBER() 등을 통해서 위의 페이지 쿼리와 동시에 쓰는 분들이 있습니다. 위와 비슷한 이유로 속도가 느려집니다.

 

자세한 설명은 아래 주소 참고

참고 : https://okky.kr/articles/282926

'Tibero' 카테고리의 다른 글

idgen 사용시  (0) 2022.09.28
오라클 insert 시에 조건절 추가  (0) 2022.09.24
오라클 sysdate 조건절 사용  (0) 2022.09.24
tibero 날짜 + 시간  (0) 2022.09.21
오라클 티베로 계층쿼리 정렬  (0) 2022.09.07