쿼리 실행 속도가 너무 느립니다... 0 4 1,709

by 윤정희 [2006.07.18 13:06:48]


고수님들 부탁 드립니다...

사업부별(gbm), 서브사업부(sub_gbm)별 통계를 내는 쿼리문입니다...

현재 직접 쿼리문을 실행시키면 60초가 걸립니다..

너무 많은 시간으로 인해....서버가 감당이 안됩니다..

현재 oracle8i 입니다...

 

고수님들께서 실행속도를 30초 이내로 단축시킬 수 있는 쿼리문을 부탁 드립니다.

 

select  gbm, sub_gbm,
 count(distinct a.vendor_code) vd_cnt,
 count(distinct(decode(b.confirm_flag,'Y',a.vendor_code))) vd_eco_cnt,
 count(distinct(decode(a.sub_gbm,c.main_gbm,a.vendor_code))) vd_main_cnt,
 count(distinct(decode(decode(a.sub_gbm,c.main_gbm,b.confirm_flag),'Y',a.vendor_code))) vd_main_eco_cnt,
 count(*) mt_cnt,
 count(decode(d.confirm_flag,'Y',1)) mt_pass_cnt,
 count(decode(d.confirm_flag,'N',1)) mt_ng_cnt,
 count(decode(decode(d.confirm_flag,null,d.result),'PASS',d.submit_date,'FAIL',d.submit_date)) mt_prog_cnt
 from  (select gbm,sub_gbm,vendor_code,item_code from egrptvdim                                                                   
         where item_status <> 'D'                                                                                                   
         group by gbm,sub_gbm,vendor_code,item_code) a,                                                                    
          egrptvdhd b, egrptvdmt c, egrptvdbh d
 where a.vendor_code = b.hq_code(+)    
 and   a.vendor_code = c.vendor_code(+)
 and   a.vendor_code = d.hq_code(+)    
 and   a.item_code = d.item_code(+)
 group by a.gbm,a.sub_gbm

 

꼭 좀 도와 주십시요.....

감사합니다...

by 현 [2006.07.18 00:00:00]
딸랑 이거만 가지고 어찌 30초 이내로 단축 시킬 수 있는 쿼리를 만들겠습니까?
다른 정보도 좀 주시죠.데이터 분포, 인덱스 정보, 실행계획 등.....
단순히 쿼리 상태로만 보면 distinct,group by 등이 맘에 걸립니다만, 꼭 필요하니까 썼겠죠? 그랬으리라 믿고 싶습니다...

by 강정식 [2006.07.18 00:00:00]
현님께서 말씀하신데로 다른 정보가 있어야 할 듯 싶네요. 단순히 쿼리만 보자면 제 경우엔 유일한 상수값을 받는 item_status 'D'에서도 부정형을 사용했으므로 인덱스를 안탈것이고 그러므로 대부분 풀스캔을 하지 않나 싶습니다. 만약 item_status에 인덱스가 걸려 있다면 이렇게 해보세요.
where not exists (select * from egrptvdi b where item_status = 'D')

by 바름둥이 [2006.07.19 00:00:00]
위에 답변추가.. exists 보다는 가능하시다면 in() 으로 사용하시는게 퍼포먼스가 좋습니다. index가 있다면은요..
그럼 수고하세요.

by 강정식 [2006.07.20 00:00:00]
바름둥이님.
item_status 'D' 를 in()을 써서 변경이 가능한가요? item_status not in('D')를 하면 인덱스를 못탈테고, item_status in()을 하려면 'D'를 제회한 값들을 하드코딩 해야하는데 어떤 방법이 있는지요?
궁금합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입