--- 튜닝 전 


select b.대리점번호, b.계약상태코드, count(*) as 계약건수 , max(b.계약일자) as 최근계약일 

 from 대리점 a, 계약 b 

 where a.대리점번호 = b.대리점번호 

  and to_char (b.계약일자, 'yyyymm') = :v_date_contract    

  and b.계약상태코드 in (select 코드 from 코드테이블  where 그룹코드 = 'A01')   --- 이 부분이 예측이 어려움  

  and a.업체 =: v_업체코드 

  group by b.대리점번호, b.계약상태코드

  order by b.대리점번호 

  ;

 

select b.deri_no, b.con_code, count(*) as con_count , max(b.con_date) as last_date 

 from deri a, contract2 b 

 where a.deri_no = b.deri_no 

  and to_char (b.con_date, 'yyyymm') = '199511'  

  and b.con_code in (select con_code from code  where group_code = 'A01')     

  and a.co_code ='A590' 

  group by b.deri_no, b.con_code

  order by b.deri_no

  ; 


 

--- 튜닝 후 

     

1) 계약일자가 'yyyymm' 형식으로 입력 될 경우 


 select /*+ ordered use_nl(b) index (a 대리점_x01) index(b 계약_x01)  */ b.대리점번호, b.계약상태코드, count(*) as 계약건수 , max(b.계약일자) as 최근계약일 

 from 대리점 a, ( select /*+ ordered use_nl(d) index(d 계약_x02)  */ d.대리점번호 , d.계약일자, d.계약상태코드 

                 from 코드테이블 c , 계약 d    

                 where c.코드 = d.코드 

                 and c.그룹코드 = 'A01'     

                ) b 

 where a.대리점번호 = b.대리점번호 

  and b.계약일자 = to_date(:v_date_contract,'')    

  and a.업체 =: v_업체코드 

  group by b.대리점번호, b.계약상태코드

  order by b.대리점번호 

  ;




2) 계약일자가 'yyyymmdd' 형식으로 입력 될 경우 


   select /*+ ordered use_nl(b) index (a deri_x01) index(b contract2_x01)  */ 

          b.deri_no, b.con_code, count(*) as con_count , max(b.con_date) as last_date 

     from deri a, ( select /*+ ordered use_nl(d) index(d contract2_x02)  */ d.deri_no , d.con_date, d.con_code

                        from code c , contract2 d    

                        where c.con_code = d.con_code 

                         and c.group_code = 'A01'     

                     ) b 

     where a.deri_no = b.deri_no 

      and to_char (b.con_date, 'yyyymm') = '199511'    

      and a.co_code = 'A590' 

    group by b.deri_no, b.con_code

    order by b.deri_no

     ;





  --- 인덱스 

   

  대리점_pk = 대리점번호 

  대리점_x01 = 업체코드 + 대리점번호  --- 인덱스만 읽고 처리 가능  

  

  계약_pk = 계약번호 

  계약_x01 = 대리점번호 + 계약일자 + 계약상태코드  

  계약_x02 = 계약상태코드     

  

  


  

  create index deri_x01 on deri(co_code, deri_no) ;

  

  create index contract2_x01 on contract2(deri_no, to_char(con_date,'yyyymm') , con_code ) ;

  

  create index contract2_x02 on contract2(con_code) ;

'ORACLE > SQLP' 카테고리의 다른 글

SQLP 시험 문제 7일차  (0) 2016.11.24
SQLP 시험문제 6일차  (0) 2016.11.24
sqlp 19회 실습문제 2번 테스트 테이블 작성  (0) 2016.11.04
SQLP 19회차 실습문제 2번  (0) 2016.11.03
SQLP 19회차 실습 1번 문제  (0) 2016.11.02

+ Recent posts