페이징 관련 쿼리 튜닝 질문좀 드리겠습니다.. 0 4 2,352

by 김실홍 [SQL Query] [2016.04.07 09:28:54]


페이징 관련 쿼리 튜닝 질문좀 드리겠습니다..

 

현재 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분 가량??)

 

튜닝을 어떤식으로 해야할지 조언좀 해주세요 ㅠㅠ

by 마농 [2016.04.07 09:52:06]

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 항목을 구하는 계산식도
페이징 전 모든 행에 대해 수행하지 말고
페이징 후 일부 행에 대해서만 수행한다면
이 또한 성능이 향상되겠지요.


by 김실홍 [2016.04.07 11:14:13]

아 NO 때문에 느려질수도있겠군요.........

 

마농님이 보시기엔 

 

방법1 과 방법2는

차이가 없나요??

 

저는 지금 방법2로 바꾼상태긴한데.. 개선은 되었거든요..

 

마농님이 가르쳐준 방법데로 수정해보았지만..

일단 처음 나오는 속도가 방법2가 빠른듯합니다..

머 뒤페이지로 갈수록 느려지고 이런것은 테스트를 해봐야되겠지만..

 

두가지 쿼리에 어떤 차이점이 있는걸까요?

 

전 보통 1번을 자주 사용했는데... ㅎㅎ

 


by 마농 [2016.04.07 11:16:43]

1번을 잘 못 사용하신 거구요.

잘 사용하면 2번과 동일할 것으로 예상합니다.


by 김실홍 [2016.04.07 11:22:35]

ㅠㅠ 그런가요.. 가르쳐주신 방법되로 해도... 속도는 2번이 더 빠릅니다..

(--요기 부분이랑 NO 구해오는 부분 도 뻇거든요..) 

인덱스 타는 흰트를 둘다 지우고해도 마찬가지네요..

 

제가 짐 실행계획을 못봐서.. 답답하긴 하네요.. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입