Back End/서버 비용

[Spring Data JPA] JPA 에서 IN 절을 사용할 때 Prepared Statement 의 효율 높이기

DevPing9_ 2023. 2. 13. 22:22

 

* 이 포스팅은 NHN 의 정지범 개발자님의 포스팅을 바탕으로 작성된 포스팅입니다.

 

 

DBA와 개발자가 모두 행복해지는 Hibernate의 in_clause_parameter_padding 옵션 : NHN Cloud Meetup

Java ORM 기술의 표준 명세인 JPA가 소개된 지 참 오래되었지만, 국내 현실상 대규모 시스템에서 적용되어 사용된 운영 경험이 충분히 쌓이지 않고 공유되지도 않는 것 같습니다.

meetup.nhncloud.com

 

 

서문


public interface SampleRepository extends CrudRepository<Sample, Integer>{
    List<Sample> findByIdIn(List<Integer> ids);
}

위와 같은 IN 절을 담은 Query Method 를 생성하면 JPA 입장에선 IN 절에 몇개의 파라미터가 들어올지 예상하기 어렵다.

 

따라서 Prepared Statement 를 재활용하지 못하는 문제가 발생하는데, 이를 재활용하기 위해 아래의 설정을 커스텀 할 수 있다.

 

 


1. Hiberante 의 in_clause_parameter_padding 설정


<property
    name="hibernate.query.in_clause_parameter_padding"
    value="true"
/>

 

위와 같이 해당 프로퍼티의 값을 true 로 설정하면 2의 거듭제곱 만큼의 패딩이 일어난다고 한다.

 

아래와 같이 실행한 쿼리는 4개의 각기 다른 종류지만 Padding 을 이용하여 Prepared Statement 를 2개만 사용하여 4개의 쿼리를 실행할 수 있다.

select .... from Sample where id in (1 ,2 ,3, 3);
select .... from Sample where id in (1 ,2 ,3, 4);
select .... from Sample where id in (1 ,2 ,3, 4, 5, 5, 5, 5);
select .... from Sample where id in (1 ,2 ,3, 4, 5, 6, 6, 6);

 

 

2. Hiberante 의  execution plan cache 설정


<property
    name="hibernate.query.plan_cache_max_size"
    value="2048"
/>

 

단순하게 실행계획을 저장하는 캐시 갯수를 늘려 효율을 높이는 방법이다.

 

 

 

 

 

 

 

Reference


 

DBA와 개발자가 모두 행복해지는 Hibernate의 in_clause_parameter_padding 옵션 : NHN Cloud Meetup

Java ORM 기술의 표준 명세인 JPA가 소개된 지 참 오래되었지만, 국내 현실상 대규모 시스템에서 적용되어 사용된 운영 경험이 충분히 쌓이지 않고 공유되지도 않는 것 같습니다.

meetup.nhncloud.com

 

 

728x90