1.  CROSS JOIN  이란?

 

크로스 조인은 모든 경우의 수를 전부 표현해주는 방식이다.
기준 테이블이 A일 경우 A의 데이터 한 ROW를 B테이블 전체와 JOIN 하는 방식이며, 결과가 N * M 이 된다.

 A테이블에 데이터가 3개, B테이블에는 데이터가 4개가 있으므로 총 12개가 검색된다.

 

CROSS JOIN은 대개 테스트로 사용할 대용량의 테이블을 생성할 경우에 사용된다고 한다.  예를 들어, 각 5 만건과 7 만건의 테이블을 CROSS JOIN 하면 35억건의 데이터를 생성시킬 수 있다.

이 경우 두 테이블 컬럼들의 총 크기와 생성될 총 행수에 따라,  시스템이 다운되거나 디스크 용량이 꽉 차 버릴 수도 있으니 주의가 필요하다.
 

2. JPA에서 주의할 점

 

팀장님께서 말씀하신게 바로 이 부분인데,  jpa에서는 동적으로 쿼리를 만들어주는 부분이 있다보니 잘못 사용하면, 나도모르게 closs join 을 사용할 수도 있어 주의를 해야한다.

이 현상은 QueryDSL 또는 specification 를 이용해서 동적으로 쿼리를 만들고 있을 경우 보통 많이 생기지만 JPQL 로 직접 쿼리를 작성할 때 주의도 해야한다. 이번 테스트는 JPQL로 테스트했다.

 

2.1. 부모와 유저는 1: N 관계이다.

@Data
@Entity
public class Users {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private Integer age;

   private String name;

   @ManyToOne(fetch = FetchType.LAZY)
   private Parent parent;
}JAVA
@Data
@Entity
public class Parent {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private Integer age;

   private String name;
}JAVA

 

 

2.2. JPQL로 외부조인 없이 부모의 필드를 조건으로 사용한다.

@Query("SELECT U "
   + "FROM Users U "
   + "WHERE U.parent.name = :s ")
List<Users> findAllByParentName(String s);

 

 

2.3. cross 조인이 발생한다.

 

select users0_.id as id1_1_, 
        users0_.age as age2_1_,
        users0_.name as name3_1_,
        users0_.parent_id as parent_i4_1_
        
from users users0_ 
cross join parent parent1_

where users0_.parent_id=parent1_.id
and parent1_.name=?SQL

 

복사했습니다!