update 질문드립니다. 0 12 2,901

by 김재훈 [SQL Query] update [2017.03.07 13:02:44]


dntcall 이라는 테이블에 80만건정도 데이터가 있으며

데이터는 reg_Date기준으로 1일,3일 각각 20만건정도 데이터 있습니다.

중복제거한후 나머지값들에 대해 update 진행하려고 하는데...시간이 오래걸려서 문의드립니다.

UPDATE DNTCALL

  SET CHK = 'Y'

WHERE ID IN ( SELECT A.ID

                     FROM DNTCALL A

                     WHERE A.REG_DATE = '20170301'

                      MINUS

                     SELECT A.ID

                     FROM DNTCALL A

                     WHERE A.REG_DATE = '20170303'

                     )

이렇게 했는데....SELECT 시간은 40초 정도 나오는데 UPDATE가 오래걸립니다.

SELECT 결과 100건 정도 나옵니다. 100건에 대해 업데이트 진행하려고 합니다.

단축할수 있는방법이 있는지 문의드립니다.

감사합니다.

 

 

by 랑에1 [2017.03.07 13:26:21]
UPDATE DNTCALL B
SET     B.CHK      = 'Y'
WHERE   B.REG_DATE = '20170301'
AND     NOT EXISTS(SELECT 1 FROM DNTCALL A WHERE A.REG_DATE = '20170303' AND A.ID = B.ID)

이렇게 해보시면 좀 낫지 않을까 싶어요.

수정했습니다 ㅎㅎ

 


by jkson [2017.03.07 14:40:21]

원본 쿼리랑 업데이트 대상이 다른 것 같습니다.


by 김재훈 [2017.03.07 17:59:20]

감사합니다. 속도 잘나옵니다...... ^^

수정사항이 나와서..다시 해야것네요..ㅜㅜ


by jkson [2017.03.07 14:40:00]
MERGE INTO DNTCALL C
USING
(
SELECT ID
  FROM DNTCALL A
 WHERE A.REG_DATE = '20170301'
   AND NOT EXISTS(SELECT 1 FROM DNTCALL B WHERE B.REG_DATE = '20170303' AND B.ID = A.ID)
) D
ON (C.ID = D.ID)
WHEN MATCHED THEN
     UPDATE SET C.CHK = 'Y'  

 


by 김재훈 [2017.03.07 18:13:55]

답변감사합니다. reg_date 보면 안될거같아서 다시 쿼리 고민중입니다.

같은날 작업을 할수있어서......


by 마농 [2017.03.07 14:59:57]

적절한 인덱스가 없어서 느린게 아닐까요?


40초 걸려 100건 나온다는 Select 구문은 어떤 건가요?
In 서브쿼리 안쪽의 minus 결과를 말하는 건가요?
아니면 서브쿼리를 IN 조건으로 주고 조회하는 메인쿼리를 말하는 건가요?
혹시 시간만 오래걸리는게 아니라 갱신 대상에 오류가 있는 것은 아닌가요?


by 김재훈 [2017.03.07 18:12:15]

IN절 안에있는 SELECT 쿼리가 40초 정도 걸리구요..

인덱스는 생성을 했습니다.

40만건씩 2번에 걸쳐 데이터가 들어오고 있구요.

작업전 delete 하여 테이블 비우고 insert 진행됩니다.

80만건중 중복데이터를 제외한 나머지 데이터를 구하려고 하는데 REG_DATE를 보면안될거같아서..

UPDATE DNTCALL A

SET A.CHK = 'Y'

WHERE ID IN ( SELECT ID

                    FROM DNTCALL

                    GROUP BY ID

                    HAVING COUNT(ID) =1

                   )

이런식으로 작업후 전체데이터에서 중복이 아닌값에 'Y'로 업데이트 해야되는데...

300초 넘어가서 끊었네요..ㅡㅡ

같은날 작업을 할수도있으니 REG_DATE를 보면 안될거같습니다.

dntcall테이블은 암호화테이블입니다.(damo) 시간을 줄일수있는 방법이 있을까요.

 


by 마농 [2017.03.07 18:48:02]

ID 항목에 인덱스가 있나요?
ID 항목이 혹시 암호화 컬럼은 아니겠죠?
중복이 없는 ID 의 갯수(갱신대상건수)는 몇개인가요?


by 김재훈 [2017.03.07 18:51:30]

인덱스있구요...ID가 암호화 컬럼입니다.

중복없는 갯수는 99개 입니다.


by jkson [2017.03.07 19:01:56]

속도 문제보다도.. 업데이트 대상이 어떤 데이터인가 하는 문제부터 짚고 넘어가야할 것 같네요.

중복이 아닌 값에 'Y'로 업데이트 한다는 게 정확히 어떤 의미인가요?

ID값이 80만건 중에 유일한 경우를 이야기하시는 건지?


by 마농 [2017.03.07 19:05:31]

암호화를 적용했다면?
dntcall 은 복호화된 뷰일듯 합니다.
암호화된 원본 테이블은 dntcall_damo 로 되어 있을 듯 하네요.
뷰 대신 원본테이블을 이용하세요.


by 김재훈 [2017.03.10 12:58:46]

원본테이블 사용해서 해결했습니다. 만족할 속도나오네요..ㅎㅎ 감사합니다.

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