DB링크로 다량의 테이블 INSERT하는 프로시저

워니·2024년 8월 19일
0

우리 회사에서 DB마이그레이션을 하며 사용자들이 생서한 39,000여개의 테이블을 기존 DB에서 신규 DB로 이관하는 작업이 필요했다.
일일히 INSERT INTO~~를 할 수 없기에 1)테이블 목록을 뽑고 2)이를 바탕으로 테이블명과 이관여부, 적재일이 표시된 F_TABL_TRANS라는 테이블과 이관하는 프로시저를 만들어서 실행했다
데이터가 계속 메모리에 남아있으면 부하가 발생하므로 프로시저의 마지막에 UNLOAD문구를 추가해주었다.

CREATE PROCEDURE SP_F_TABL_TRANS(IN S_SEQ DECIMAL(6), IN E_SEQ DECIMAL(6))
LANGUAGE SQLSCRIPT
AS
/*************************************************/
BEGIN
	DECLARE
    CURSOR CURS1 FOR
    	SELECT SEQ
        	, TABL
        	FROM F_TABL_TRANS
        WHERE SEQ BETWEEN :S_sEQ AND :E_SEQ
        	AND TRYN = 'N'
        ORDER BY SEQ;
        
    FOR FORS1 AS CURS1
    DO
    	EXEC 'TRUNCATE TABLE ' || FORS1.TABL || ';';
        
        EXEC 'INSERT INTO ' || FORS1.TABL || ' SELECT * FROM DB링크.' || FORS1.TABL | ';';
        
        EXEC 'UPDATE A'
        	|| '	SET TRYN = ''Y'''
            || '	, LDNG_YMD = TO_CHAR(NOW(), ''YYYY-MM-DD'')'
            || '	, R_CNT = (SELECT COUNT(*) FROM ' || :FORS1.TABL || ')'
            || '	FROM F_TABL_TRANS A'
            || '	WHERE SEQ =' || :FORS1.SEQ || ';';
            
        EXEC 'UNLOAD ' || :FORS1.TABL || ';';
        
    END FOR;
END;

--> 프로시저를 만들었더니 seq번호만 입력하면 테이블들이 순차적으로 입력되어 좋았지만, 퇴근시간 이후나 주말에는 이미 돌린 프로시저를 종료한 이후 더 돌릴 수가 없어서 시간적으로 손해라고 생각되었다.
그래서 SAP Data Service Designer를 이용해 job을 만들고, 이를 이용해 프로시저를 호출하는 방식으로 변경하였다. 테이블 4만여개 중 이제 1000개의 테이블밖에 남지 않았지만 시간을 좀 더 단축시키기 위해 호다닥 만들었다.

SET_VAR : 시작, 종료 SEQ번호를 넣어줌
While : 종료SEQ를 기준으로 언제까지 실행되어야 하는지 넣어줌
첫번째 스크립트 : 프로시저 호출
두번째 스크립트 : 시작, 종료 SEQ에 1씩 더해줌

--> 이렇게 만들어주었을때 장점
1. 프로시저를 1번씩 호출해서 메모리 부하가 적어진다
2. 메모리 부족으로 프로시저 호출이 종료되는 문제를 잘 발생시키지 않는다
3. 기존DB/신규DB에 테이블이 정상적으로 존재하지 않거나, 데이터가 INSERT되지 않는 오류시에도 기존의 프로시저 호출의 경우 오류가 나면서 종료되는데 끝인데, JOB은 계속 돌아서 시간상으로 이득이다. 데이터가 이관되지 않은 경우는 데이터이관 기록 테이블을 확인하여 알 수 있다.

너무 잘돌아가고~ 업무 하나가 줄어서 기분이 좋다
이렇게 작은 부분 자동화할 수 있는 것들은 자동화해봐야지

profile
매일, 조금씩 나아가는중

0개의 댓글