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() 등을 통해서 위의 페이지 쿼리와 동시에 쓰는 분들이 있습니다. 위와 비슷한 이유로 속도가 느려집니다.
자세한 설명은 아래 주소 참고
'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 |