숑숑이의 개발일기

Batch Insert란?

batch insert는 여러 개의 SQL Statement를 하나의 구문으로 처리하는 것을 말한다. batch insert는 jdbc batch 기능이고, hibernate에서 write-behind(쓰기 지연)를 통해 처리한다. 여러 개의 구문을 합쳐 하나로 보내기 때문에 성능 개선을 할 수 있다. JPA는 트랜잭션이 commit 되는 순간 한꺼번에 flush가 이뤄진다.

 

사용방법

application.yml 파일을 아래와 같이 설정한다.

spring:
    jpa:
        database: mysql
        properties:
            hibernate.jdbc.batch_size: 50
            hibernate.order_inserts: true
            hibernate.order_updates: true
            hibernate.dialect: org.hibernate.dialect.~~~
            hibernate.show_sql: true

		datasource:
		        url: jdbc:~~://localhost:{port}/~~?&rewriteBatchedStatements=true
		        driver-class-name: com.~~.jdbc.Driver
  • batch_size : 한 번의 트랜잭션에서 다룰 size 지정
  • order_inserts : 데이터 일괄 입력시 사용 (default = false)
  • order_updates : 데이터 일괄 수정시 사용 (default = false)
  • rewriteBatchedStatements : batch 쿼리가 재구성 되어 성능향상이 일어남

 

Batch Insert 사용시 주의사항
Entity Key 생성을 GenerationType.IDENTITY로 하면 batch 옵션이 동작하지 않는다. IDENTITY 옵션은 쿼리가 수행된 이후에 값을 얻을 수 있기 때문이다. 다르게 말해 Entity를 persist 하기 위해서 @Id로 지정한 필드에 값이 필요한데 IDENTITY(auto_increment) 타입은 실제 DB에 insert를 해야만 값을 얻을 수 있기 때문에 batch 처리가 불가능하다.

 

Batch Insert를 사용하는 이유

주요 이유는 성능 향상을 위함이다. 일반적으로 Hibernate는 각각의 SQL 쿼리를 실행하기 위해 많은 시간을 소비한다. 이는 네트워크 비용, 데이터베이스 트랜잭션 비용 등을 포함하여 많은 오버헤드를 초래할 수 있다. 따라서 Batch Insert를 사용하여 한 번의 데이터베이스 트랜잭션에서 여러 개의 SQL 쿼리를 실행하면 이러한 오버헤드를 크게 줄일 수 있다. 이는 특히 대량의 데이터를 데이터베이스에 삽입할 때 매우 유용하다.

 

성능 비교

bulk insert를 사용했을 때와 사용하지 않았을 때, 데이터의 양이 많아 지는 경우 최대 40~50배의 성능 차이가 나는 것을 확인할 수 있다.

  10건 100건 1000건 10000건 100000건
JPA 0.03s 0.19s 2.06s 18.47s 175.58s
jdbc 0.01s 0.01s 0.09s 0.33s 4.31s
차이 3배 19배 22배 55.96배 40.73배

 

https://velog.io/@backtony/JPA-Batch-Insert와-JDBC-Batch-Insert
https://velog.io/@dongvelop/Spring-Data-JPA-Batch-Insert로-한번에-데이터-삽입하기
https://sabarada.tistory.com/220

 

profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다