초보적인 SQL 수행시간 질문입니다... 0 2 2,803

by 케이3 [SQL Query] sql update 수행시간 [2017.04.15 00:47:12]


안녕하세요...

업데이트 실행시 수행시간차이가 너무 많이 나는 이유가 궁금합니다.

혹시 VIEW가 아닌 TABLE 로 하면 빨라 질까요???

 

1.

UPDATE TMP_GENTRDTD_COMP

SET TRDFLAG = '0'

WHERE TRDGDT = '20170329'

AND TRDNUM IN (

SELECT TRDNUM FROM V_GENTRDTD_COMP

)

 

2.

UPDATE TMP_GENTRDTD_COMP

SET TRDFLAG = '0'

WHERE TRDGDT = '20170329'

AND TRDNUM IN (

5889, 12445, ...... (약 5000여 개)

)

 

위, 1번 쿼리의 VIEW "V_GENTRDTD_COMP" DATA가 5000 여개가 있습니다.

2번으로 실행하면 약 7초정도 시간이 걸리는데..

1번으로 실행하면(VIEW의 값으로 조회해서) 끝나지 않네요;;;

 

우선, 급한대로.. 2번을 6번 수행해서 업데이트는 했습니다.

 

3. VIEW 생성 쿼리

CREATE OR REPLACE VIEW V_GENTRDTD_COMP AS

SELECT TRDNUM FROM

( SELECT TRDNUM

  FROM V_GENTRDTD_COMP_20170329 -- "원장 TABLE 에서 3월29일자 DATA" VIEW .

  MINUS

  SELECT TRDNUM

  FROM GENTRDTD_COMP_20170329  -- "외부에서 받은 DATA 를 SQL LOADER로 INSERT한 TABLE"

)

 

감사합니다...

by jkson [2017.04.17 08:36:39]

두 쿼리가 뷰를 사용했냐 아니냐 차이니 문제는 뷰에 있다고 봐야겠죠?

정확한 건 실행계획을 보아야 알겠지만 뷰에서 사용한 minus 연산 보다는 아무래도 not exists가 나을 것 같네요.

CREATE OR REPLACE VIEW V_GENTRDTD_COMP AS
SELECT TRDNUM
  FROM V_GENTRDTD_COMP_20170329 A
 WHERE NOT EXISTS (SELECT 1
                     FROM GENTRDTD_COMP_20170329 B
                    WHERE B.TRDNUM = A.TRDNUM)

trdnum에 인덱스가 있는지도 보시고요.

 


by 케이3 [2017.04.22 19:23:35]

답변 감사합니당.^^

음.. view 때문인가 보군요...

trdnum 에 인덱스 없습니다.

"not exists"는 "minus" 보다.. 속도가 느려서 포기했었습니다.

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