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
'데이터베이스 > SQL' 카테고리의 다른 글
[SQL] JOIN(결합)에 대해서(with.옵티마이저 및 결합 알고리즘) (0) | 2023.02.20 |
---|---|
[SQL] 정규화란? (0) | 2023.02.05 |