hibernate.query.in_clause_parameter_padding = true ?

2024. 3. 6. 17:22ยท๐Ÿ“‚ backend/spring

1. org.hibernate.engine.query.spi.QueryPlanCache

์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, where ์ ˆ์— in clause ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. JPA ์˜ ๊ตฌํ˜„์ฒด์ธ Hibernate ๋Š” JPQL, Criteria ์ฟผ๋ฆฌ๋ฅผ AST(Abstract Syntax Tree)์œผ๋กœ ํŒŒ์‹ฑํ•œ๋‹ค. ์ด ๋•Œ ์ฟผ๋ฆฌ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด Hibernate ์—์„œ๋Š” QueryPlanCache ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค QueryPlanCache ์„ ํ™•์ธํ•˜์—ฌ ์‹คํ–‰ ๊ณ„ํš์˜ ์บ์‹ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. (๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ, ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ถ”์ถœํ•˜์—ฌ ParameterMetadata ์— ์ €์žฅํ•œ๋‹ค.)

 

2. spring.jpa.properties.hibernate.query.in_clause_parameter_padding

spring.jpa.properties.hibernate.query.in_clause_parameter_padding=true

hibernate.query.in_clause_parameter_padding ์˜ต์…˜์€ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ 5.2.18 ๋ฒ„์ „ ์ดํ›„์— ๋“ฑ์žฅํ•œ ํ”„๋กœํผํ‹ฐ ์ด๋‹ค. ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ true ๋กœ ์„ค์ •ํ•˜๋ฉด in clause ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด 2์˜ ์ œ๊ณฑ๋‹จ์œ„๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

[1] ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ํ•œ๋ฒˆ ์˜ˆ๋ฅผ ๋“ค์–ด ํ™•์ธํ•ด๋ณด์ž.

-- http://localhost:8080/api/v1/students?tagNames=1,2,3,4,5 (in์ ˆ 5๊ฐœ)

select
    student0_.id as id1_0_,
    student0_.name as name2_0_,
    student0_.tag_name as tag_name3_0_ 
from
    student student0_ 
where
    student0_.tag_name in (? , ? , ? , ? , ?); -- 5๊ฐœ ํŒŒ๋ผ๋ฏธํ„ฐ

์˜ˆ๋ฅผ ๋“ค์–ด, in clause ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ 5๊ฐœ์ธ ๊ฒฝ์šฐ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ ์ค‘๋ณต๋œ ๊ฐ’์„ ํŒจ๋”ฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ 8๊ฐœ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ•ด๋‹น ์˜ต์…˜์„ ์„ ์–ธํ•˜๋ฉด ์บ์‹ฑ๋œ ์ฟผ๋ฆฌ ํ”Œ๋žœ๋ฅผ ์ค„์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ์˜ต์…˜์˜ default value ๋Š” false ์ด๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฐฏ์ˆ˜์˜ in clause ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— memory leak ์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

[2] in clause ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

MySQL ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ, IN (list) ์กฐ๊ฑด์ด ์‚ฌ์šฉ๋˜๋ฉด, list ์—˜๋ฆฌ๋ฉ˜ํŠธ ๊ฐ’๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋จผ์ € ๋กœ๋“œํ•ด์„œ ์ค‘๋ณต ๊ฐ’์„ ์ œ๊ฑฐํ•ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

in (1, 2, 3, 3) -> in (1, 2, 3)

 

 

[3] hibernate.query.in_clause_parameter_padding ์˜ˆ์‹œ

spring.jpa.properties.hibernate.query.in_clause_parameter_padding ๊ฐ’์ด true ์ผ ๊ฒฝ์šฐ, in clause ์˜ 2์˜ ์ œ๊ณฑ ๋‹จ์œ„๋กœ ์ค‘๋ณต๋œ ๊ฐ’์„ ํŒจ๋”ฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— QueryPlanCache ์— ์ฟผ๋ฆฌ ํ”Œ๋žœ์„ ์บ์‹ฑํ•  ๋•Œ๋„ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ผ์ •ํ•œ ๊ฐฏ์ˆ˜๋กœ ์ฑ„์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

false

[QueryPlanCache]
3๊ฐœ : in (?, ?, ?)
4๊ฐœ : in (?, ?, ?, ?)
5๊ฐœ : in (?, ?, ?, ?, ?)
6๊ฐœ : in (?, ?, ?, ?, ?, ?)
7๊ฐœ : in (?, ?, ?, ?, ?, ?, ?)
8๊ฐœ : in (?, ?, ?, ?, ?, ?, ?, ?)

[์ฟผ๋ฆฌ ์‹คํ–‰]
3๊ฐœ : in (?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
4๊ฐœ : in (?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
5๊ฐœ : in (?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
6๊ฐœ : in (?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
7๊ฐœ : in (?, ?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
8๊ฐœ : in (?, ?, ?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
[QueryPlanCache]
4๊ฐœ : in (?, ?, ?, ?)
8๊ฑ” : (?, ?, ?, ?, ?, ?, ?, ?)

[์ฟผ๋ฆฌ ์‹คํ–‰]
3๊ฐœ : in (?, ?, ?) -> 4๊ฐœ : (?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
4๊ฐœ : in (?, ?, ?, ?) -> 4๊ฐœ : (?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)
5๊ฐœ : in (?, ?, ?, ?, ?) -> 8๊ฑ” : (?, ?, ?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ) 
6๊ฐœ : in (?, ?, ?, ?, ?, ?) -> 8๊ฑ” : (?, ?, ?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ) 
7๊ฐœ : in (?, ?, ?, ?, ?, ?, ?) -> 8๊ฑ” : (?, ?, ?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ) 
8๊ฐœ : in (?, ?, ?, ?, ?, ?, ?, ?) -> 8๊ฑ” : (?, ?, ?, ?, ?, ?, ?, ?) -> (์žฌ์‚ฌ์šฉ)

 

Reference

  • https://kwonnam.pe.kr/wiki/java/hibernate/performance
  • https://meetup.nhncloud.com/posts/211
  • https://www.manty.co.kr/bbs/detail/develop?id=98

'๐Ÿ“‚ backend > spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring Batch] Job ์‹คํ–‰ ํ”„๋กœํผํ‹ฐ, JobParameter, Scope  (0) 2024.08.26
Spring Batch Architecture  (0) 2024.05.10
JPA ์— UUID version 7 ์ ์šฉํ•˜๊ธฐ  (0) 2024.03.04
[Spring] Spring AOP ๋™์ž‘ ์•Œ์•„๋ณด๊ธฐ  (0) 2024.03.04
[JPA] ์ฝ”๋“œ๋กœ ๋ณด๋Š” OSIV ์™€ ๊ณ ์ฐฐ  (2) 2024.01.30
'๐Ÿ“‚ backend/spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring Batch] Job ์‹คํ–‰ ํ”„๋กœํผํ‹ฐ, JobParameter, Scope
  • Spring Batch Architecture
  • JPA ์— UUID version 7 ์ ์šฉํ•˜๊ธฐ
  • [Spring] Spring AOP ๋™์ž‘ ์•Œ์•„๋ณด๊ธฐ
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (84)
      • ๐Ÿ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • ๐Ÿ“‚ computer-science (5)
      • ๐Ÿ“‚ programming-language (12)
        • java (12)
      • ๐Ÿ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • ๐Ÿ“‚ cloud (2)
        • aws (2)
      • ๐Ÿ“‚ frontend (1)
        • react (0)
      • ๐Ÿ“‚ education & lecture (16)
        • ์ธํ”„๋ผ ๊ณต๋ฐฉ (11)
        • ํ•ญํ”Œ ๋ฐฑ์—”๋“œ 7๊ธฐ (5)
      • ๐Ÿ“‚ ai (1)
        • claude (1)
      • ๐Ÿ“‚ etc (2)
        • ํšŒ๊ณ  (1)
        • ์ปจํผ๋Ÿฐ์Šค (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์Šคํ”„๋ง์บ ํ”„ ํ›„๊ธฐ
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
    ํšŒ๊ณ 
    spring camp 2025
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    spring-batch
    ๋™์‹œ์„ฑ
    react
    Redisson
    ์ธํ”„๋ผ๊ณต๋ฐฉ
    spring AOP
    mysql
    spring
    UUID
    gof
    kafka
    nGrinder
    ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์„ค๊ณ„
    JPA
    AWS
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
hibernate.query.in_clause_parameter_padding = true ?
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”