티스토리 뷰
뜬금없지만 궁금해져서 찾아봐서 개인서버에 적용해봤다.
https://madplay.github.io/post/avoid-n+1-problem-in-jpa-using-querydsl-fetchjoin
로그를 보니 실제로 그런 증상이 나온다.
Hibernate:
select
user0_.id as id1_11_,
user0_.level as level2_11_,
user0_.name as name3_11_,
user0_.team_id as team_id4_11_
from
user user0_
Hibernate:
select
team0_.id as id1_10_0_
from
team team0_
where
team0_.id=?
Hibernate:
select
team0_.id as id1_10_0_
from
team team0_
where
team0_.id=?
Hibernate:
select
team0_.id as id1_10_0_
from
team team0_
where
team0_.id=?
Hibernate:
select
articlelis0_.user_id as user_id3_0_0_,
articlelis0_.id as id1_0_0_,
articlelis0_.id as id1_0_1_,
articlelis0_.title as title2_0_1_,
articlelis0_.user_id as user_id3_0_1_
from
article articlelis0_
where
articlelis0_.user_id=?
Hibernate:
select
articlelis0_.user_id as user_id3_0_0_,
articlelis0_.id as id1_0_0_,
articlelis0_.id as id1_0_1_,
articlelis0_.title as title2_0_1_,
articlelis0_.user_id as user_id3_0_1_
from
article articlelis0_
where
articlelis0_.user_id=?
...
너무 길어서 접었지만 전체 실행 쿼리가 있고나서 자잘한 쿼리들이 나온다
이래서 1개 더 추가된 N+1 문제라고 하나 보다.
해결방법은 fetch를 해주고 dictinct로 row의 중복을 제거하면된다.
실제로 스티커 보드쪽에 적용을 해보니 N+1문제를 발견할 수 있었다
게시물은 1, 리플은 N인 상태로 1:N 관계이다.
Hibernate:
select
stickerent0_.id as id1_6_0_,
stickerrep1_.id as id1_7_1_,
stickerent0_.auther as auther2_6_0_,
stickerent0_.contents as contents3_6_0_,
stickerent0_.created_at as created_4_6_0_,
stickerent0_.file_folder as file_fol5_6_0_,
stickerent0_.file_name_zip as file_nam6_6_0_,
stickerent0_.search_tag as search_t7_6_0_,
stickerent0_.title as title8_6_0_,
stickerent0_.updated_at as updated_9_6_0_,
stickerent0_.view_count as view_co10_6_0_,
stickerrep1_.auther as auther2_7_1_,
stickerrep1_.contents as contents3_7_1_,
stickerrep1_.created_at as created_4_7_1_,
stickerrep1_.sticker_id as sticker_5_7_1_,
stickerrep1_.updated_at as updated_6_7_1_,
stickerrep1_.sticker_id as sticker_5_7_0__,
stickerrep1_.id as id1_7_0__
from
t_sticker stickerent0_
left outer join
t_sticker_reply stickerrep1_
on stickerent0_.id=stickerrep1_.sticker_id
이것은 dictinct전의 fetchJoin을 한 상태
Hibernate:
select
distinct stickerent0_.id as id1_6_0_,
stickerrep1_.id as id1_7_1_,
stickerent0_.auther as auther2_6_0_,
stickerent0_.contents as contents3_6_0_,
stickerent0_.created_at as created_4_6_0_,
stickerent0_.file_folder as file_fol5_6_0_,
stickerent0_.file_name_zip as file_nam6_6_0_,
stickerent0_.search_tag as search_t7_6_0_,
stickerent0_.title as title8_6_0_,
stickerent0_.updated_at as updated_9_6_0_,
stickerent0_.view_count as view_co10_6_0_,
stickerrep1_.auther as auther2_7_1_,
stickerrep1_.contents as contents3_7_1_,
stickerrep1_.created_at as created_4_7_1_,
stickerrep1_.sticker_id as sticker_5_7_1_,
stickerrep1_.updated_at as updated_6_7_1_,
stickerrep1_.sticker_id as sticker_5_7_0__,
stickerrep1_.id as id1_7_0__
from
t_sticker stickerent0_
left outer join
t_sticker_reply stickerrep1_
on stickerent0_.id=stickerrep1_.sticker_id
이것은 distinct 후의 fetchJoin 상태이다.
컬럼이 일부 줄어든걸 확인할수 있다
'Road to Beyrouth' 카테고리의 다른 글
스웩이 아닌 Swagger 사용기 (0) | 2022.02.11 |
---|---|
코딩테스트 대비 1주차 (0) | 2021.12.19 |
이대로는 안된다. (0) | 2021.12.01 |