UPDATE WHERE절 EXISTS에 의한 차이점..... 궁금해요. 0 10 14,444

by 뽕뽕 [SQL Query] UPDATE WHERE EXISTS [2016.02.01 17:31:17]


여러모로 배울게 많은 사이트네요.^^

궁금한게 있는데요.

아래 CASE1, CASE2의 큰 차이점이 뭔가요?

속도?? 큰 차이가 있나요?

매번 CASE2와 같이 쿼리 작성을 하거든요.

이번에 UPDATE가 어떻게 수행되는지 알고 싶네요...

 

 

CASE1

UPDATE TABLE1 T1

      SET COL2 = (SELECT COL2

                          FROM TABLE2

                        WHERE COL1 = T1.COL1)

WHERE COL1 IS NOT NULL

 

 

CASE2

UPDATE TABLE1 T1

      SET COL2 = (SELECT COL2

                          FROM TABLE2

                        WHERE COL1 = T1.COL1)

WHERE COL1 IS NOT NULL

   AND EXISTS (SELECT COL1

                          FROM TABLE2

                        WHERE COL1 = T1.COL1)

by 창조의날개 [2016.02.01 17:52:10]

두 쿼리 결과 자체가 다를거 같네요..

CASE1은 COL1이 NULL이 아닌 경우면 UPDATE 하겠지만..

CASE2는  TABLE1과 TABLE2에 CASE1이 같은 경우에만 UPDATE 하겠죠..

 

CASE2와 아래 쿼리와의 속도 차이를 비교 해 보고 싶은게 아닐지?


UPDATE TABLE1 T1
      SET COL2 = (SELECT COL2
                          FROM TABLE2
                        WHERE COL1 = T1.COL1)
WHERE COL1 IN (SELECT COL1 FROM TABLE2)
;

 


by 뽕뽕 [2016.02.05 08:57:46]

답변 감사합니다.

제 스스로 잘못 알고 있었던 부분이 있네요.

 

CASE1
UPDATE TEST1 T1
   SET COL2 = (SELECT COL2
                 FROM TEST2
                WHERE COL1 = T1.COL1)
WHERE COL1 IS NOT NULL
  AND EXISTS (SELECT COL1
                FROM TEST2
               WHERE COL1 = T1.COL1)
;

CASE2
UPDATE TEST1 T1
   SET COL2 = (SELECT COL2
                 FROM TEST2
                WHERE COL1 = T1.COL1)
WHERE COL1 IS NOT NULL
  AND COL1 IN (SELECT COL1
                 FROM TEST2
                WHERE COL1 = T1.COL1)     
;       

CASE1, CASE2의 속도 비교가 맞겠네요.

궁금한데 어떤게 빠른지 답변 가능할까요? 현장에서는 어떻게 주로 쓰는지 궁금하네요.


by 마농 [2016.02.05 11:27:22]

IN 절의 WHERE COL1 = T1.COL1 조건은 잘못 사용된 조건이죠.
IN 을 쓸때는 이 조건을 빼는게 맞죠
이 조건을 주면 EXISTS 와 그닥 다를게 없구요.


IN 과 EXISTS 비교는 좀 어려운 문제입니다.
구문 상의 IN 과 EXISTS 비교보다는
실행계획상의 처리 과정을 비교하셔야 합니다.
구문이 달라도 실행계획이 같을 수 있구요.
구문이 같아도 실행계획이 다를 수 있죠.
실제로 실행계획을 비교확인하셔야 할 것 같네요.


by jkson [2016.02.01 18:09:46]

뭔가 예시를 잘못들었거나 지금껏 의도와 다르게 사용하셨을 것 같아요.

예를 들어서 table1에 

co1 : 1, col2 : 2 값을 가지는 row가 1개 존재하고

table2 에는 col1 : 2 라는 값을 가지는 row가 1개 존재한다면

case1의 경우  table1의 col2 값은 null이 되겠고

case2의 경우 조건절을 만족하는 데이터가 없으므로 table1의 col2 값은 2로 유지 되겠죠.


by 뽕뽕 [2016.02.05 08:58:37]

답변 감사합니다.

제 스스로 잘못 알고 있었던 부분이 있네요..ㅜㅜ


by DeSSa [2016.02.01 18:47:51]

정확한 의도는 모르겠지만, B테이블 정보를 A테이블에 마이그레이션 하는 용도로 보입니다.

CASE1: 테이블1의 COL1이 NULL이 아닐 때, 테이블1, 2의 COL1들을 비교하여 일치 하는것에 대한 테이블2의 COL2 정보를 테이블1에 업데이트 한다.

CASE2: 테이블1의 COL1이 NULL이 아니고, 테이블2의 COL1 정보가 테이블1의 COL1와 일치 하는게 있으면 테이블1, 2의 COL1들을 비교하여 일치 하는것에 대한 테이블2의 COL2 정보를 테이블1에 업데이트 한다.
       
단순 CASE1과 CASE2를 수행하는 것을 비교 했을 때 시간이 오래 걸리는 작업은 CASE2입니다.

[추가쿼리]

UPDATE TABLE1 T1 INNER JOIN TABLE2 T2 ON T1.COL1 = T2.COL1
SET T1.COL2 = T2.COL2


- 위에 사용 하신 쿼리를 이렇게 표현 하실 수도 있습니다.       
       
*추가적으로 INDEX가 걸려 있다 하더라도 NULL값 비교시에는 INDEX가 적용 되지 않습니다.


by 뽕뽕 [2016.02.05 09:04:28]

답변 감사합니다.

근데 위 UPDATE 쿼리가 가능한가요?

ORACLE 상에서 UPDATE시 조인 가능하나요???


by 마농 [2016.02.05 11:18:50]

오라클 문법이 아닙니다.


by 마농 [2016.02.02 08:42:03]

두 쿼리의 결과가 같은지가 관건이네요.
결과가 같다면?
  굳이 2번처럼 쓸 필요 없구요.
  서브쿼리 체크하느라 더 느리겠죠.
결과가 다르다면?
  1번처럼 사용하면 원치 않는 결과를 초래 할 수도 있습니다.
  갱신 대상 컬럼(col2)가 비어 있다면?
    결과에는 큰 문제 없습니다. 다만 대상 건수가 많아 속도가 더 느리겠죠.
  갱신 대상 컬럼(col2)가 비어 있지 않다면?
    조건에 만족하지 않을 때 널로 업데이트 되는 이상현상이 발생될 수 있습니다.
    물론 널로 업데이트 하는것이 목적이라면 상관 없구요. 그게 아니라면 문제입니다.


by 뽕뽕 [2016.02.05 09:07:37]

답변 감사합니다.

제 의도는 속도에 대한 질문쪽이 었는데, 제가 잘못 알고 있었던 부분이 있네요.

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