페이징 관련 쿼리 튜닝 질문좀 드리겠습니다..
현재 2가지를 사용하고있는데요
방법1 : select 로 오더바이 해서.... 서브쿼리로 감싸서 페이징
SELECT *
FROM (
SELECT ROWNUM RNUM, ALL_LIST.* , #totCnt# -(ROWNUM-1) AS NO
FROM (
select tb.* from TABLE01 tb
ORDER BY TITLE ASC
) ALL_LIST
)
WHERE RNUM > 0
AND RNUM <= 20
방법2 : row_number() 함수를 이용해서 오더바이하고 between A and B 로 페이징
select * from
(select tb.*, row_number() over(order by title asc) as num
from TABLE01 tb )
where num between 10 and 20
방법1은 오더 바이때문에 1번 실행시 7초 정도 걸리지만.. 하루있다 실행해도 계속 7초 걸리고 결과가 나옵니다
방법2는 처음 실행했을때 분석함수(?)를 이용해서 가져와서 그런지 속도는 느리지만
그뒤로 실행 하면 빠르게 가져옵니다...............
어떤 방법이 더 나은 방법일까요??
방법1에서 방법2로 바꾼 상태인데
처음 클릭했을때 너무 느리네요 (1분 가량??)
튜닝을 어떤식으로 해야할지 조언좀 해주세요 ㅠㅠ
1번 방법을 효율적으로 사용하지 못했네요.
RNUM 최종 체크하기 이전에 ROWNUM 으로 미리 걸러줘야 합니다.
그래야 정렬용 버퍼를 최소한으로 사용합니다.
이렇게 사용하면 1,2번 모두 동일한 성능을 낼 것으로 생각되는데요.
SELECT * FROM (SELECT ROWNUM rnum , all_list.* FROM (SELECT * FROM table01 tb ORDER BY title ASC) all_list WHERE ROWNUM <= 20 -- 요기 ) WHERE rnum > 0 AND rnum <= 20 ;
추가로
* 로 모든항목을 다 가져오기 보다는
꼭 필요한 항목만 명시해서 가져오는것이
버퍼를 절약하고 정렬 성능을 높이는 방법이구요.
마찬가지로 위 쿼리에서 no 항목을 구하는 계산식도
페이징 전 모든 행에 대해 수행하지 말고
페이징 후 일부 행에 대해서만 수행한다면
이 또한 성능이 향상되겠지요.