Mybatis + MSSQL + Bulk Update

김준영·2024년 4월 1일

다음에 다시보자

목록 보기
2/2

Mybatis를 사용해서 Mssql에 Bulk Update를 해야할 일이 생겼다.

많은 컬럼에 업데이트를 해야하는 것은 아니지만 많은 양의 데이터를 업데이트해야 했다.

처음엔 Mybatis의 foreach를 사용해서 업데이트를 진행했는데 4만건의 데이터를 이렇게 업데이트한다는건 매우 말이 안되는 일이다.

그래서 임시테이블을 사용하여 업데이트를 진행했다.

<update id="UpdateDeviceStatusBulk"
            parameterType="해당 DTO(DAO) 경로">
  
  		// 임시테이블 생성
        CREATE TABLE #tempTable (
        DEVICE_SEQ_NO INT,
        SEND_RESULT VARCHAR(500)
        );

  		// 임시테이블 생성 후, 해당 테이블에 업데이트할 데이터 삽입
        INSERT INTO #tempTable (DEVICE_SEQ_NO, SEND_RESULT) VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.deviceSeqNo}, #{item.sendResult})
        </foreach>;

  		// 업데이트할 원본테이블과 임시테이블을 조인하여 업데이트
        UPDATE D
        SET D.SEND_RESULT = T.SEND_RESULT
        FROM DEVICE_MASTER D
        INNER JOIN #tempTable T ON D.DEVICE_SEQ_NO = T.DEVICE_SEQ_NO;

  		// 업데이트 진행 후 임시테이블 삭제
        DROP TABLE #tempTable;
    </update>
  1. 임시테이블을 생성
  2. 임시테이블에 업데이트할 데이터 삽입
  3. 임시테이블과 원본테이블 조인하여 업데이트
  4. 임시테이블 삭제

위와 같이 한번에 업데이트를 진행하려고 했지만 저장프로시저의 파라미터가 최대 2100개까지라 한번에 업데이트하는 수를 1000개로 잡고 List를 분할하여 저장했다.

저장프로시저의 파라미터를 구하는건 foreach에 #{}으로 작성한 매개변수가 몇갠지 확인하고 2100을 나누면 한번에 업데이트할 수 있는 수를 구할 수 있다.

이 방법말고 임시테이블이 아닌 새로운 테이블을 생성해서 해당 테이블에 Insert를 진행하고 해당 Insert가 끝나면 다음 업데이트 코드로 넘어가 해당 테이블과 업데이트할 테이블을 조인하여 업데이트 후, 새로운 테이블의 값들을 delete 하는 방법도 있다.

하지만 위와 같은 방법은 새로운 테이블을 여러 사람이 동시에 사용할 수 없을때 쓸 수 있는 방법이라 사용하지 않았다.

만약 여러 사람이 동시에 사용한다면 insert 후 다른 사람의 내용까지 삭제가 되는 불상사가 생기기 때문이다.

profile
ㅎㅎ

0개의 댓글