안녕하세요.
아래와 같은 형태는 쿼리가 실행되지만,
update sdisret2 a
set issu_qty = (select issu_qty from ppsd_do_map where aft_do = a.vbeln ), dlf = 'Y'
where exists (select 1 from ppsd_do_map where aft_do = a.vbeln )
비슷한 형태라고 봐지는데 시간이 100초가 계속넘어가네요.
문법이 맞는지 잘 모르겠습니다.
조인을 해서 업데이트를 하려고 하는데 어디에서 잘못되었는지 이래 저래 해도 잘 안풀리네요..
도움을 기다립니다.
update ppsd_do_map a
set bef_relno = (select trim(issu_rel_no) from sdisret2 where vbeln = a.bef_do),
bef_so = (select trim(vgbel) from sdisret2 where vbeln = a.bef_do),
aft_relno = (select trim(issu_rel_no) from sdisret2 where vbeln = a.aft_do),
aft_so = (select trim(vgbel) from sdisret2 where vbeln = a.aft_do)
where exists (select 1 from sdisret2 where vbeln = a.aft_do)
위의 전통적인 업데이트 방식은 실행이 한쪽 방향으로만 고정됩니다.
업데이트 대상을 풀스캔 하면서 서브쿼리를 매행마다 반복 실행하지요.
1번 쿼리가 금방 끝났다면?
sdisret2 의 건수는 적고, ppsd_do_map.aft_do 에 인덱스가 있다는 얘기고
2번 쿼리가 오래 걸린다면?
ppsd_do_map 에 건수가 많고, sdisret2.vbeln 에 인덱스가 없을 수도 있다는 얘기죠.
인덱스가 없다면?
=> 인덱스를 만들어 주고, DarkBee 님 방식대로 반복되는 서브쿼리를 좀 줄여주시구요.
인덱스를 만들 수 없다면?
=> 위와 같은 방식으로 해서는 안되구요, Merge 구문을 이용하세요.