Spring & Spring Boot

[ JPA ] batch_fetch_size

사과씨앗 2024. 2. 21. 23:43
728x90
반응형

 

 

[batch_fetch_size]

 

JPA(Java Persistence API)는 데이터베이스 조회 성능을 향상시키기 위해 다양한 설정을 제공합니다. 그 중 하나인 batch_fetch_size 설정은 한 번의 쿼리로 여러 개의 엔티티를 한꺼번에 가져오는 방식을 지원하여 성능 개선을 도모합니다.

 

일반적으로 JPA는 연관된 엔티티를 필요할 때마다 지연 로딩(Lazy Loading) 방식을 사용합니다. 이는 연관된 엔티티가 실제로 필요한 시점에 데이터베이스에서 조회되는 방식입니다. 그러나 지연 로딩은 여러 번의 쿼리 호출을 필요로 하기 때문에 성능에 영향을 줄 수 있습니다. 이때 batch_fetch_size 설정을 사용하면 한 번의 쿼리로 여러 개의 연관된 엔티티를 가져올 수 있으므로, 쿼리 호출 횟수를 최소화하고 성능을 향상시킬 수 있습니다.

 

batch_fetch_size 설정은 주로 JPA 구현체인 Hibernate에서 지원되는 옵션입니다. Hibernate에서는 해당 설정을 사용하여 데이터베이스에서 일정한 크기의 데이터를 번에 가져올 있습니다. 설정하는 방법은 persistence.xml 파일이나 Hibernate 설정 파일에서 해당 옵션을 지정하면 됩니다. 적절한 batch_fetch_size 값은 신중하게 선택해야 합니다. 너무 작은 값으로 설정하면 여전히 여러 번의 쿼리 호출이 발생하여 성능 향상 효과가 제한될 있고, 너무 값으로 설정하면 메모리 사용량이 증가하고 데이터베이스 서버에 부하가 걸릴 있습니다. 따라서 실제 데이터베이스의 특성과 애플리케이션의 요구사항을 고려하여 적절한 batch_fetch_size 값을 선택해야 합니다.

 

batch_fetch_size 적용을 하지 않은 경우 1:N 관계의 post 엔티티와 tag 엔티티가 존재할 경우 post를 한번조회 하더라도 여러번의 tag 조회 쿼리가 실핼된다. 

Hibernate: select p1_0.id,p1_0.content,p1_0.created_at,p1_0.created_by,p1_0.title,p1_0.updated_at,p1_0.updated_by from post p1_0 order by p1_0.created_at desc limit ?,?

Hibernate: select t1_0.post_id,t1_0.id,t1_0.created_at,t1_0.created_by,t1_0.name,t1_0.updated_at,t1_0.updated_by from tag t1_0 where t1_0.post_id=?
Hibernate: select t1_0.post_id,t1_0.id,t1_0.created_at,t1_0.created_by,t1_0.name,t1_0.updated_at,t1_0.updated_by from tag t1_0 where t1_0.post_id=?
Hibernate: select t1_0.post_id,t1_0.id,t1_0.created_at,t1_0.created_by,t1_0.name,t1_0.updated_at,t1_0.updated_by from tag t1_0 where t1_0.post_id=?

 

 

batch_fetch_size 적용을 하게 되면 사이즈 값을 적용한 많큼 in절을 생성하여 한번에 쿼리로 엔티티를 조회하여 가져온다.

Hibernate: select p1_0.id,p1_0.content,p1_0.created_at,p1_0.created_by,p1_0.title,p1_0.updated_at,p1_0.updated_by from post p1_0 order by p1_0.created_at desc limit ?,?
Hibernate: select t1_0.post_id,t1_0.id,t1_0.created_at,t1_0.created_by,t1_0.name,t1_0.updated_at,t1_0.updated_by from tag t1_0 where t1_0.post_id in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

 

적용예시

    jpa:
        hibernate:
            ddl-auto: update
        show-sql: true
        properties:
            hibernate:
                bytecode:
                    format_sql: true
                default_batch_fetch_size: 100

 

728x90
반응형