@BatchSize(size = 100)으로 설정했음에도 불구하고 실제 조회 쿼리를 실행하면 아래와 같은 실행 결과가 나왔다.
select emojilist0_.comment_no as comment_5_3_1_, emojilist0_.emoji_no as emoji_no1_3_1_, emojilist0_.emoji_no as
emoji_no1_3_0_, emojilist0_.board_no as board_no4_3_0_, emojilist0_.comment_no as comment_5_3_0_,
emojilist0_.emoji as emoji2_3_0_, emojilist0_.user_no as user_no3_3_0_ from tb_emoji emojilist0_ where
emojilist0_.comment_no in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: select emojilist0_.comment_no as comment_5_3_1_, emojilist0_.emoji_no as emoji_no1_3_1_, emojilist0_.emoji_no as emoji_no1_3_0_, emojilist0_.board_no as board_no4_3_0_, emojilist0_.comment_no as comment_5_3_0_, emojilist0_.emoji as emoji2_3_0_, emojilist0_.user_no as user_no3_3_0_ from tb_emoji emojilist0_ where emojilist0_.comment_no in (?, ?, ?, ?, ?, ?, ?, ?, ?)
* 데이터 베이스에 34개의 데이터가 존재하였는데 25개, 9개의 in절 조회 2번이 발생하였다.
이유
관계형 데이터 베이스들은 select * from table_name where x in (?), select * from table_name where x in (?, ?)과 같은 Preparedstatement는 미리 문법을 파싱해서 캐싱을 해둔다.
즉, BatchSize가 100이라면 (?) 부터 (?, ?), ..., (?) 100개의 Preparedstatement를 준비해야 한다. 이런 방식은 성능이 떨어지기 때문에 Hibernate는 /2를 적용하여 최적화를 진행한다.
100 / 2 => select * from table_name where x in (? 50개)
50 / 2 => select * from table_name where x in (? 25개)
25 / 2 => select * from table_name where x in (? 12개)
...
최적화를 위해 위와 같이 Preparedstatement를 준비하는 것이다.
그래서 BatchSize를 100으로 설정해도 25개, 9개의 in 절 쿼리 2개가 나가게 된 것이다.
* 내가 설정한 BatchSize 만큼의 데이터를 한 번에 가져오고 싶다면 Application.yml 파일에 아래의 설정을 추가하면 된다.
** 이 방법은 최적화가 되지 않기 때문에 권장하지 않는다고 한다.
'트러블 슈팅' 카테고리의 다른 글
[JPA] UnexpectedRollbackException (0) | 2022.11.04 |
---|---|
[JPA] Data truncation: Data too long for column (0) | 2022.10.29 |
[Jmeter] HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported (0) | 2022.10.22 |
[Error] WebClient MacOS 에러 (0) | 2022.09.30 |
[Spring Boot] @Lombok 에러 (0) | 2022.09.09 |