본문 바로가기
데이터베이스

Join 쿼리를 어떻게 최적화할까

by N.Damgom 2021. 3. 10.

다음과 같이 사용자 엔티티로 엮여있는 아이템과 디바이스 엔티티를 생각해보자.

특정 조건을 만족한 아이템들의 리스트를 가져와서 그 아이템의 사용자의 디바이스로 알림을 보내고 싶다.

사용자의 아이템이 여러개더라도 각 디바이스에는 알림이 한번만 가게끔 해보자.

 

먼저 One to Many 관계인 사용자와 아이템을 조인해보자.

아이템이 가지고 있는 fk(사용자의 pk이다)로 조인이 된다. 아이템 하나당 사용자 하나를 가지고 있기 때문에 엔티티 수가 늘어나진 않는다.

여기서 디바이스를 가져오기 위해 사용자-디바이스, One to Many 조인을 해보자.

디바이스 1의 fk는 사용자A의 pk 이다. join은 카티전 곱과 셀렉션 연산의 합이므로 레코드가 뻥튀기 된다. 한 사용자가 아이템을 세개, 디바이스를 네개 가지고 있으면 3x4 개의 엔티티가 생긴다.

 

먼저 아이템과 사용자를 페치조인해서 가져오자. accountItem은 account가 키인 멀티 밸류 맵이다.

 

그리고 이 리스트를 in절을 이용해서 디바이스를 가져오자.

 

찾아보니 @BatchSize라는 어노테이션도 있다. 강의 들었던것 같은데 다 잊었나보다. 역시 사용하지 않으면 죽은 지식이다.