조인 종류와 뷰
두 테이블의 행을 어떤 규칙으로 짝지을지 정하는 것이 조인이고, 그 쿼리에 이름을 붙인 것이 뷰다
조인 종류
A 테이블 3행, B 테이블 2행이고 그중 1행씩만 조건에 맞는다고 해봅시다.
| 종류 | 남기는 것 | 결과 행수 |
|---|---|---|
| INNER | 양쪽 모두 맞는 것 | 1 |
| LEFT OUTER | 왼쪽 전부 + 맞는 오른쪽 | 3 |
| RIGHT OUTER | 오른쪽 전부 + 맞는 왼쪽 | 2 |
| FULL OUTER | 양쪽 전부 | 4 |
| CROSS | 조건 없이 모든 조합 | 6 |
CROSS JOIN 은 조건이 없어서 두 테이블의 행수를 곱한 결과가 나옵니다. 10행과 5행이면 50행입니다. 이것을 카티전 곱이라 부릅니다.
CROSS JOIN 이 사고가 되는 경우
의도해서 쓰는 경우는 드물고, 조인 조건을 빠뜨렸을 때 실수로 발생합니다.
| 상황 | 결과 |
|---|---|
| 10만 행과 10만 행 | 100억 행. 쿼리가 끝나지 않는다 |
| 조건절에 조인 조건 누락 | 옛 문법에서 WHERE 를 빼먹으면 그렇게 된다 |
의도적으로 쓰는 곳도 있습니다. 날짜 테이블과 상품 테이블을 곱해 빈 조합까지 포함한 집계표를 만드는 경우입니다.
조인이 행수를 늘리는 것
한 행이 여러 행과 맞으면 결과가 늘어납니다. 주문 1건에 주문상품 3건이 있으면 조인 결과는 3행이 되고, 주문 금액을 그대로 합하면 세 배가 됩니다.
| 문제 | 대응 |
|---|---|
| 집계가 부풀려진다 | 먼저 집계한 뒤 조인하거나, DISTINCT 를 쓴다 |
| 행이 예상보다 많다 | 조인 키가 유일한지 확인한다 |
뷰
쿼리에 이름을 붙여 테이블처럼 쓰는 것입니다.
| 해주는 것 | 내용 |
|---|---|
| 복잡한 쿼리 감추기 | 여러 조인을 한 이름으로 |
| 권한 제어 | 특정 컬럼만 노출하는 뷰를 주고 원본 접근은 막는다 |
| 호환 유지 | 테이블 구조가 바뀌어도 뷰 이름으로 옛 형태를 유지한다 |
| 해주지 않는 것 | 내용 |
|---|---|
| 성능 향상 | 조회할 때마다 원래 쿼리가 실행된다. 결과를 저장하지 않는다 |
| 인덱스 | 뷰 자체에는 인덱스를 만들 수 없다. 원본 테이블의 인덱스를 쓴다 |
| 무조건 갱신 가능 | 집계나 여러 테이블 조인이 든 뷰는 갱신할 수 없다 |
첫 번째가 가장 자주 오해됩니다. 뷰는 저장된 쿼리일 뿐입니다. 결과를 저장하고 싶으면 구체화된 뷰를 써야 하고, 그것은 갱신 시점을 관리해야 합니다.