MERGE /*+ INDEX(A PK_FT) PARALLEL(B 3) */ INTO FT A USING TMP B
ON (A.거래일 = B.거래일)
WHEN MATCHED THEN
UPDATE SET
A.ID = B.ID
WHEN NOT MATCHED THEN
INSERT (
A.거래일,
A.ID)
VALUES (
B.거래일,
B.ID)
;
소스(TMP) 건수는 약 3백만건 됩니다.
타겟(FT) 테이블의 건수는 약 7억건 됩니다.
타겟 테이블은 24개의 파티션(201001 ~ 201112) 으로 월별로 되어 있습니다.
파티션 키는 첫번째 컬럼 거래일의 substring (1,6) 해서 'YYYYMM' 입니다.
소스 3백만건중 250만건은 201111,201112 파티션에 해당합니다.
3백만건을 가지고, 7억건에 merge into를 하려고 합니다.
첫번째 방법
소스를 3개로 나누어 각 테이블별로 적재한다
1 : 201111 이전
2. 201111
3. 201112
적재 후 각 테이블별로 타겟테이블의 파티션을 지정하여 merge into 를 한다.
두번째 방법
소스를 단순히 건수를 균등하게 3개로 나눈다
테이블 1,2,3을 만들어 적재한다.
타겟에 파티션 지정없이 merge into를 한다.
논리적으로 생각하면 첫번째 방법이 빠를것 같은데 두번째 방식이 빠릅니다.
이유가 뭘까요?
또 3백만건을 최대한 빨리 merge into 하는 방법은 뭐가 있을까요?
고수님들의 고견 부탁드립니다. |