석양이진당
45
2020-11-11 10:27:00
5
329

오라클 페이징 구간검색 쿼리 성능 질문드립니다


기존 쿼리에 페이징 기능을 넣어야합니다.

무한스크롤? 방식이라 페이지번호 없이 스크롤 이벤트가 걸릴때

필요한 만큼 데이터를 가져오면 되는데요.

데이터 번호를 매기는 startIndex와 endIndex 파라미터가 주어질 때,

아래 두가지 방법 중에 어떤 것이 성능이 나을까요?

실제 쿼리가 넘 복잡해서 간략하게 적어봤습니다.


-- 첫번째 방법
select 
	* 
from (
	select 
		rownum as seq, 
		wrapping_table.* 
	from (
		select 
			a1
		       ,a2 
		from 
			table_a
		where 
			rownum <= #{endIndex}
		) wrapping_table
	)
where 
	seq >= #{startIndex}
;

-- 두번째 방법
select 
	*
from (
	select
		a1
   	       ,a2
	   ,rownum seq
	from
		table_a
	)
where 
	seq between #{startIndex} and #{endIndex}
;


두번째가 좀더 깔끔해보이긴 하는데 어떤 방법이 나은 것인지 모르겠습니다.

두 방식의 실제 쿼리 돌렸을 때 실행계획을 캡쳐해왔는데요.

실행계획 보는 방법도 잘 모르겠습니다 ㅠ


첫번째 방법 실행계획


두번째 방법 실행계획


조언 부탁드립니다.

또 다른 좋은 방법이 있다면 말씀해주세요.

글 읽어주셔서 감사합니다.

0
  • 답변 5

  • 성능최적화계획
    855
    2020-11-11 10:43:13

    실행계획이 같아 보입니다?

  • 석양이진당
    45
    2020-11-11 11:01:34

    성능최적화계획 님

    첫번째 방법이 아래 VIEW 항목이 뭔가 좀더 길어요 ~

    근데 희한한 일이 생겼습니다.

    개발디비에서 돌려볼 때는 시간이 두가지 다 비슷했는데

    상용디비에서 테스트해보니 두번째 방법은

    10분이 넘어도 결과가 나오지 않네요;; 어찌된 일인지;;

  • 석양이진당
    45
    2020-11-11 11:10:55

    데이터 용량에 따른 차이도 큰 것 같습니다.

    아무래도 두번째 방법은 못쓰겠는데 혹시 또 첫번째 방법보다 더 좋은 방법이 있을까요?

  • 2020년산신입
    92
    2020-11-11 15:50:23
    첫 번쨰 방법은 데이터 베이스에서 데이터를 불러올 때
    endindex라는 마지막 조건까지만 로드한 다음, 시작 조건에 맞추어 출력을 하기 때문에 비교적 효율적인 방법인데 반해,
    두 번째 방식은 전체 데이터를 전부 로드한 다음 해당되는 조건의 req만을 출력하는 방식으로 이전 방식보다 덜 효율적이라고 알고 있습니다.

    (+ 저도 공부중인 상태이니 아니거나 좀 더 나은 방법이 있다면 저도 알려주시면 감사하겠습니다.)
  • 석양이진당
    45
    2020-11-11 20:27:32

    2020년산신입님

    답변 감사합니다. 

    일단 첫번째 방식으로 하려고 하는데, 진행하다가 더 좋은 방식을 발견한다면 알려드리겠습니다. ^^

  • 로그인을 하시면 답변을 등록할 수 있습니다.