중복 여부의 판단은 SELECT된 튜플 속에 속해있는 모든 컬럼의 값들 자체가 체크의 기준이 됨.
mysql 내부적으로 UNION과 UNION ALL을 처리하는 과정을 보면,
1. 최종결과에 적합한 임시테이블(Temporary Table)을 메모리 테이블로 생성
2. union인 경우, temporary테이블의 모든 컬럼으로 union hash인덱스 생성
3. 서브쿼리1 실행 후 결과를 temporary테이블에 복사
4. 서브쿼리2 실행 후 결과를 temporary테이블에 복사
4-1. 만약 3, 4번 과정ㅇ서 temporary테이블이 특정 사이즈 이상으로 커지면
temporay테이블을 disk temporary테이블로 변경(이때 uniqy hash인덱스는 uniqy B-tree인덱스로 변경됨)
5. temporary 테이블을 읽어서 client에 결과 전송
6. temporary 테이블 삭제
UNION ALL > UNION
union은 all 후 중복제거를 하기 때문에 속도가 더 느림
가공한 테이블을 쿼리 안에서 계속 쓰다보면 가독성이 떨어질 수 있음
이때 with구문을 사용하면 서브쿼리로 추출된 데이터를 별칭을 지정해 임시테이블의나 view로 관리할 수 있는데
이를 통해 특정 서브쿼리 결과를 관리할 수 있고, 같은 서브쿼리가 필요할 때 별칭으로 뷰를 불러오면 쿼리문이 그대로 실행됨.
with은 가상 테이블, 즉 테이블에 있어 메모리를 차지한다는 단점이 있음
with절을 사용하는 이유는,
temp라는 임시 테이블을 사용해 쿼리를 저장해 놓고 데이터를 엑세스하기 때문에 성능이 좋아짐
하지만, 너무 많이 쓰면 임시 테이블이 견딜 수 있는 정도를 넘어 느려지게 됨ㅜ