join 해서 update 처리 문의 0 2 1,716

by lover [SQL Query] [2014.05.07 15:48:37]


안녕하세요.

아래와 같은 형태는 쿼리가 실행되지만,

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)

 

by DarkBee [2014.05.07 15:51:25]

update ppsd_do_map a
    set ( bef_relno, bef_so, aft_relno, aft_so ) = (select trim(issu_rel_no)
                                                         , trim(vgbel)
                                                         , trim(issu_rel_no)
                                                         , trim(vgbel) 
                                                      from sdisret2 
                                                     where vbeln = a.bef_do
                                                   )
where exists (select 1 from sdisret2 where vbeln = a.aft_do)


by 마농 [2014.05.07 16:25:04]

위의 전통적인 업데이트 방식은 실행이 한쪽 방향으로만 고정됩니다.
업데이트 대상을 풀스캔 하면서 서브쿼리를 매행마다 반복 실행하지요.
1번 쿼리가 금방 끝났다면?
sdisret2 의 건수는 적고, ppsd_do_map.aft_do 에 인덱스가 있다는 얘기고
2번 쿼리가 오래 걸린다면?
ppsd_do_map 에 건수가 많고, sdisret2.vbeln 에 인덱스가 없을 수도 있다는 얘기죠.
인덱스가 없다면?
 => 인덱스를 만들어 주고, DarkBee 님 방식대로 반복되는 서브쿼리를 좀 줄여주시구요.
인덱스를 만들 수 없다면?
 => 위와 같은 방식으로 해서는 안되구요, Merge 구문을 이용하세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입