순서!
1. 일대일관계까지는 일단 limit랑 offset지정해서, 페이징한다. (lazy와 with fetch join은 당연!)
2. 일대다관계의 쿼리 -> lazy초기화할때 땡겨올건데 - 이때 설정하는 옵션!!
hibernate.default_batch_fetch_size !!
이것을 이용하면 - in 쿼리 안에 날라가는 파라메터의 갯수를 조정할 수 있다.
일반적으로는 100~1000개로 잡는다고 한다.
이 옵션을 설정한 후 쿼리를 날리면 -
1) 일단 일대일관계 쿼리 날리고 ->
2) 일대 다 관계 쿼리를 IN( ?,?,?...)로 날리고 ->
3) 일대 다 관계로 끌어온 값 안에 또 다른 연관관계 있으면 그것도 IN절로 각각 날려준다!!
3. 이렇게 함으로써 - 만약에 batch size설정이 없었다면
1대일쿼리 조회 결과 2개-> 2개 안에 orderitems 2개 -> 각각의 orderitem이 일대일관계로 item 정보 1개 =
2 * 2* 2 해서 날라가는 쿼리를
1 + 1+ 1로 단번에 줄일 수 있다!!
4. distinct fetch join 은 페이징이 안된다는 한계가 있는데 - 이것을 이러한 방식으로 극복할 수 있는 것이다!
5. distinct fetch join : 일대다관계의 쿼리 끌어올때 - 데이터 개수가 뻥튀기 된다.
이것을 JPA가 묶어주는 역할을 한다 ( 단, 쿼리결과는 그냥 평범한 SQL이고. 이건 어쩔수없다. JPA가 메모리상에서 distinct하게 처리한다)
댓글 없음:
댓글 쓰기