MERGE를 이용한 UPDATE시 시간 문제... ㅠ.ㅠ 0 3 1,913

by 페이즈 [Oracle Tuning] [2012.01.06 13:56:51]



우선 2개의 테이블이 각각 4개의 컬럼으로 구성되어 있습니다.

테이블1 (학번, 코드1, 코드2, 코드3)
PK 및 INDEX 는 학번
보유자료 : 1972년 ~ 2012년 자료 보유

테이블2 (학번, 코드1, 코드2, 코드3)
PK 및 INDEX 는 학번
보유자료 : 2008년 ~ 2011년 자료 보유


위의 테이블2 의 데이터를 테이블1 에 UPDATE 하려고 합니다.

MERGE /*+ USE_HASH */
 INTO (SELECT 학번, 코드1, 코드2, 코드3 FROM 테이블1 WHERE SUBSTR(학번,1,4)='2008') A
USING (SELECT 학번, 코드1, 코드2, 코드3 FROM 테이블2 WHERE SUBSTR(학번,1,4)='2008') B
   ON (A.학번 = B.학번)
 WHEN MATCHED THEN
UPDATE SET A.코드1 = B.코드1, A.코드2 = B.코드2, A.코드3 = B.코드3 ;

이런 형태로 하였는데...

속도가 너무 안나옵니다. (결과가 아예 안나와요~ ㅠ.ㅠ)

제가 뭘 잘못 했는지 지적 부탁드립니다.

잘못 된게 없다면... 조언 부탁 드립니다.

감사합니다.

좋은 하루 되세요~
by 마농 [2012.01.06 14:33:13]
1. 컬럼을 가공하지마시고 반대로 조건값을 가공하세요.
- SUBSTR(학번,1,4)='2008' ====> 학번 LIKE '2008%'
2. a 테이블은 굳이 서브쿼리가 필요없습니다.
- 테이블 직접 사용하세요.
3. use_hash 는 왜?
- 힌트 빼세요.

by 페이즈 [2012.01.06 15:00:24]
답변 감사합니다. (_ _)

근데 문제는 따로 있었네요~
테이블이 LOCK 걸려서 결과가 나오지 않고 있었더라는... ㅠ.ㅠ
아무리 해도 너무 올래 걸려서 힌트도 넣고...
서브쿼리로 제한을 걸어 보려고 한건데요...
바보같이 LOCL 걸린걸 못 알아차렸네요~ ㅠ.ㅠ
지금은 5초도 안걸리네요.

그리고 컬럼 가공이 아닌 조건을 가공하라는 말씀 감사합니다.
초자가... 오늘 하나 또 배웠네요~ ^^*
감사합니다.

by 잽스페로 [2012.02.07 14:21:10]
실제로 현업에서는 merge into 잘 안써요..그냥 프로시져를 짜고말지;;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입