How to Avoid N+1 Queries
JPAλ₯Ό μ¬μ©νλ©΄ μμ£Ό λ§λκ² λλ N+1 Queryμ λν΄ μμ보μμ
References: jojoldu.tistory.com
What are N+1 queries?
νμ μν°ν°λ€μ 첫 쿼리 μ€νμ ν λ²μ κ°μ Έμ€μ§ μκ³ , Lazy LoadingμΌλ‘ νμν κ³³μμ μ¬μ©λμ΄ μΏΌλ¦¬κ° μ€νλ λ λ°μνλ λ¬Έμ
How to Avoid N+1 Queries?
1. Join Fetch
μ‘°ν μ λ°λ‘ κ°μ Έμ€κ³ μΆμ Entity Fieldλ₯Ό μ§μ νλ κ²
ex)
νμ EntityκΉμ§ ν λ²μ κ°μ ΈμμΌ ν λλ μ¬μ©ν μ μλ€.
ex)
but, μ΄ λ°©λ²μ λΆνμν μΏΌλ¦¬λ¬Έμ΄ μΆκ°λλ λ¨μ μ΄ μλ€
μ΄ fieldλ Eager μ‘°ν, μ fieldλ Lazy μ‘°ν λ₯Ό ν΄μΌνλ€
κΉμ§ queryμμ νννλ κ²μ λΆνμνλ€κ³ λλ μ μλ€.
κ·Έλ΄ λ, μλμ λ°©λ²μ μ¬μ©ν μ μλ€.
2. @EntityGraph
@EntityGraph
μ attributePath
μ query μν μ λ°λ‘ κ°μ Έμ¬ fieldλͺ
μ μ§μ νλ©΄, Lazyκ° μλ Eager μ‘°νλ‘ κ°μ Έμ€κ² λλ€
ex)
μμ κ°μ΄ attributePath
λ₯Ό μ§μ νλ©΄, μλ³Έ 쿼리 (SELECT a FROM School a)μ μμ μμ΄ Eager/Lazy fieldλ₯Ό μ μνκ³ μ¬μ©ν μ μλ€.
μΆκ°λ‘ TearcherκΉμ§ ν λ²μ κ°μ Έμ€λ queryλ μλμ κ°μ΄ ννν μ μλ€
μ£Όμν μ
JoinFetch
λ Inner Join, Entity Graph
λ Outer Join λΌλ μ°¨μ΄μ μ΄ μμμ μ μνμ. 곡ν΅μ μΌλ‘ μΉ΄ν
μμ κ³±(Cartesian Product) μ΄ λ°μνμ¬, Subject
μ λ§νΌ School
μ΄ μ€λ³΅ λ°μνκ² λλ€
ν΄κ²° λ°©μ
Solution 1
1:N fieldμ typeμ
Set
μΌλ‘ μ μΈνκΈ°Set
μ μ€λ³΅μ νμ©νμ§ μλ μλ£ κ΅¬μ‘°μ΄κΈ° λλ¬Έμ, μ€λ³΅ λ±λ‘μ΄ λμ§ μλλ€
ex)
Set
μ μμκ° λ³΄μ₯λμ§ μκΈ° λλ¬Έμ, LinkedHashSet
μ μ¬μ©νμ¬ μμλ₯Ό 보μ₯νλ€
Solution 2
distinct
λ₯Ό μ¬μ©νμ¬ μ€λ³΅μ μ κ±°νκΈ°
μ΄ λΆλΆμ @Query
μμ μ μ©νλ κ²μ΄κΈ° λλ¬Έμ, join fetch
, @EntityGraph
λ λμΌνλ€
ex)
Last updated