-
[Spring Data JPA] JPA 에서 IN 절을 사용할 때 Prepared Statement 의 효율 높이기Back End/서버 비용 2023. 2. 13. 22:22
* 이 포스팅은 NHN 의 정지범 개발자님의 포스팅을 바탕으로 작성된 포스팅입니다.
서문
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
728x90'Back End > 서버 비용' 카테고리의 다른 글
[SQL 튜닝] Offset 쿼리가 느린 이유 (0) 2022.12.19 [Spring Security] Filter 가 두번 실행될 때 (when filter get executed twice in Spring) (0) 2022.12.17