티스토리 뷰

어제 오님께서 이런 문의를 하셨더랬다.

페이징 쿼리가 하나 있는데 소팅은 등록일순 / 가나다순으로 하고,
조회(필터링)조건은 5개 이상인데 한페이지 볼때마다 30초씩 걸린단다..

세부 조건은,
tab1 은 항상 전체에 대해서

- 등록일자 최신순(regdttm),
- 이름 가나다순(name),
- 최신수정일(moddttm) 순으로

선택된 대로 페이징이 되어야 하고,
각 테이블은 100만개이상의 데이터로 구성된 테이블들이다.

응답속도는 100ms 정도가 좋을 듯 하다.
tab1에 regdttm 에 index걸고,
후딱 짜봤다.

select * from (
 select /*+ ordered use_nl(a, b, c) index_desc(a tab1_idx2) */
     a.col1, b.col2, c.col3
     row_number() over (order by 1) rn
      from tab1 a, tab2 b, tab3 c 
     where a.col1 = b.col1
       and b.col2 = c.col2   
) a
where rn > 0
  and rn < 500

잉? 30초가 넘는다.
뭐가 잘못되었지...  11g부터 옵티마이저가 힌트를 무시하나..
하다가.

select * from (
 select /*+ ordered use_nl(a, b, c) index_desc(a tab1_idx2) */
     a.col1, b.col2, c.col3
     row_number() over (order by 1) rn
      from tab1 a, tab2 b, tab3 c 
     where a.col1 = b.col1
       and b.col2 = c.col2    
       and a.regdttm > ' '
) a
where rn > 0
  and rn < 500


이렇게 하니까 잘된다.

index 를 regdttm, moddttm, name에 각각 걸고
저거 각각 다르게 넣어서 소팅한다. 잘된다.

기본적인 얘기지만, 꼭 기억하자~
댓글
댓글쓰기 폼