Programming/Java

[Java] 대용량 Insert 처리 방법의 속도 비교 (다중 Insert)

728x90
반응형

Service 로직에서 for문을 통해 insert하는 방법

1. 랜덤한 자료 10,000건 생성

// 랜덤으로 10000건의 데이터 생성
int count = 0;
List<Board> list = new ArrayList<Board>();
while(true) {
	count++;
	String title = RandomStringUtils.randomAlphabetic(10);
	String contents = RandomStringUtils.randomAlphabetic(10);
	list.add(new Board(title, contents));
	if(count >= 10000) {
		break;
	}
}

* RandomStringUtils: commons-lang3 라이브러리 등록

 

2. Service 로직 (for문)

for(Board board : list) {
	repository.save(board);
}

 

3. Insert 구문

INSERT INTO T_BOARD
(
	TITLE,
	CONTENTS,
	REG_DATE
)
VALUES
(
	#{title},
	#{contents},
	NOW()
)

 

4. 실행

boardService.saveList_loop(list);

 

SQL에서 foreach문을 사용해 insert하는 방법

1. 랜덤한 자료 10,000건 생성

// 랜덤으로 10000건의 데이터 생성
int count = 0;
List<Board> list = new ArrayList<Board>();
while(true) {
	count++;
	String title = RandomStringUtils.randomAlphabetic(10);
	String contents = RandomStringUtils.randomAlphabetic(10);
	list.add(new Board(title, contents));
	if(count >= 10000) {
		break;
	}
}

* RandomStringUtils: commons-lang3 라이브러리 등록

 

2. Service 로직 (Map 전달)

Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("list", list);
repository.saveList(paramMap);

 

3. Insert 구문 (foreach)

INSERT INTO T_BOARD
(
	TITLE,
	CONTENTS,
	REG_DATE
)
VALUES
<foreach collection="list" item="board" separator=",">
(
	#{board.title},
	#{board.contents},
	NOW()
)
</foreach>

 

4. 실행

boardService.saveList_map(list);

 

결과 비교

총 10,000 건의 데이터를 각각의 방법으로 insert 시켰다.

long start = System.currentTimeMillis();
// 실행
long end = System.currentTimeMillis();
logger.info("실행 시간: {}초", (end - start) / 1000.0);

 

1. for문 테스트 결과

실행 시간: 39.018초

 

2. foreach구문 테스트

실행 시간: 0.701초

 

속도 차이가 엄청나다! 

100건까지는 첫 번째 방법을 이용해도 큰 차이 없지만, 그 이상의 경우 수십배의 차이가 나는 것을 볼 수 있다.

나의 경우 55배의 속도 차이가 발생했다.

 

첫 번째 방법의 경우 개수만큼 connection을 호출하기 때문에 데이터가 많을수록 그만큼 호출이 잦아져 처리 시간이 증가된다.

두 번째 방법의 경우 오직 한 번의 connection을 호출하기 때문에 데이터가 많던 적던 처리 시간이 짧다.

 

 

728x90
반응형