18강 기능적 관점으로 구분하는 결합의 종류
- SQL은 기능적인 관점으로 크로스 결합, 내부 결합, 외부 결합으로 분류할 수 있습니다.
-> 이 세 가지는 생성되는 결과의 형태에 따라 이름 지어졌으며,
각각의 이름이 서로 관련 있습니다.
-> 이 세 가지는 서로 배타적인 분류입니다.
1. 크로스 결합 - 모든 결합의 모체
- 크로스 결합은 실무에서 사용할 기회가 거의 없습니다.
-> 단, 크로스 결합을 살펴보는 이유는 크로스 결합이 결합이라는 연산을 이해하는 지름길이기 때문입니다.
- 크로스 결합을 위한 샘플 테이블 정의
CREATE TABLE Employees
(emp_id CHAR(8),
emp_name VARCHAR(32),
dept_id CHAR(2),
CONSTRAINT pk_emp PRIMARY KEY(emp_id));
CREATE TABLE Departments
(dept_id CHAR(2),
dept_name VARCHAR(32),
CONSTRAINT pk_dep PRIMARY KEY(dept_id));
- 크로스 결합
SELECT *
FROM Employees
CROSS JOIN
Departments;
- 크로스 결합이 실무에서 사용되지 않는 이유
(1) 이러한 결과가 필요한 경우가 없음
(2) 비용이 매우 많이 드는 연산임
2. 내부 결합
- 내부 결합(inner join)은 가장 많이 사용되는 조합 중 하나임
-> 대부분의 SQL 관련 책이 결합을 설명할 때 내부 결합부터 시작함
- 내부 결합은 다음과 같이 실행할 수 있음
SELECT E.emp_id, E.emp_name, E.dept_id, D.dept_name
FROM Employees E INNER JOIN Departements D
ON E.dept_id = D.dept_id;
- 내부 결합과 같은 기능을 하는 상관 서브쿼리를 만들 수 있음
SELECT E.emp_id, E.emp_name, E.dept_id,
(SELECT D.dept_name
FROM Departments D
WHERE E.dept_id = D.dept_id) AS dept_name
FROM Employees E;
3. 외부 결합
- 외부 결합(outer join)은 내부 결합과 함께 자주 사용되는 결합입니다
-> '내부'와 '외부'라는 명칭이 나타내는 것처럼 내부 결합과 외부 결합은 배타적인 연산입니다.
- 외부 결합은 다음과 같이 세 가지 종류가 있습니다.
(1) 왼쪽 외부 결합
(2) 오른쪽 외부 결합
(3) 완전 외부 결합
// 왼쪽 외부 결합
SELECT E.emp_id, E.emp_name, E.dept_id, D.dept_name
FROM Departments D LEFT OUTER JOIN Employees E
ON D.dept_id = E.dept_id;
// 오른쪽 외부 결합(오른쪽 테이블이 마스터)
SELECT E.emp_id, E.emp_name, D.dept_id, D.dept_name
FROM Employees E RIGHT OUTER JOIN Departments D
ON E.dept_id = D.dept_id;
4. 자기 결합
- 자기 결합(self join)은 문자 그대로 자기 자신과 결합하는 연산으로,
간단하게 말하면 같은 테이블(또는 같은 뷰)를 사용해 결합하는 것입니다.
-> 이는 앞에서 설명했던 세 종류의 결합과는 분류 자체가 다릅니다.
19강 결합 알고리즘과 성능
- 옵티마이저가 선택 가능한 결합 알고리즘은 크게 다음과 같은 세 가지가 있습니다.
(1) Nested Loops
(2) Hash
(3) Sort Merge
-> 옵티마이저가 어떤 알고리즘을 선택할지 여부는 데이터 크기 또는 결합 키의 분산이라는 요인에 의존합니다.
-> 그 중 가장 빈번하게 볼 수 있는 알고리즘은 Nested Loops로,
각종 결합 알고리즘의 기본이 되는 알고리즘입니다.
-> 다음으로 중요한 것은 Hash입니다.
1. Nested Loops
- Nested Loops는 이름 그대로 중첩 반복을 사용하는 알고리즘입니다.
-> SQL에서 결합은 한 번에 두 개의 테이블만 결합하므로,
본질적으로 이중 반복과 같은 의미입니다.
- Nested Loops의 단점
- '구동 테이블이 작은 Nested Loops' + '내부 테이블의 결합 키에 인덱스'라는 조합만 있다면
성능은 충분하다고 생각할 수 있습니다.
-> 하짐나 기대만큼의 응답 시간이 나오지 않기도 합니다.
-> 보통 이런 경우는 결합 키로 내부 테이블에 접근할 때 히트되는 레코드가 너무 많기 때문입니다.
2. Hash
- Hash라는 알고리즘은 시스템 세계에서 굉장히 자주 사용됩니다.
-> 입력에 대해 어느 정도 유일성과 균일성을 가진 값을 출력하는 함수를 해시라고 합니다.
-> 해시 결합은 일단 작은 테이블을 스캔하고,
결합 키에 해시 함수를 적용해서 해시값으로 변환합니다.
-> 이어서 다른 테이블(큰 테이블)을 스캔하고, 결합 키가 해시값에 존재하는지를 확인하는 방법으로
결합을 수행합니다.
3. Sort Merge
- Nested Loops가 비효율적인 경우, Hash 사용 외에 또 다른 선택지로 Sort Merge라는 알고리즘도 있습니다.
Sort Merge는 간단하게 Merge 또는 Merge Join이라 부르기도 합니다.
Sort Merge는 결합 대상 테이블들을 각각 결합 키로 정렬하고, 일치하는 결합 키를 찾으면 결합합니다.
참고
- SQL 레벨업
'DB' 카테고리의 다른 글
SQL 레벨업 5장 반복문 (2) (0) | 2022.04.25 |
---|---|
SQL 레벨업 5장 반복문 (1) (0) | 2022.04.18 |
SQL 레벨업 4장 집약과 자르기 (1) | 2022.04.18 |
SQL 레벨업 3장 SQL의 조건 분기 (0) | 2022.04.11 |
SQL 레벨업 1장 DBMS 아키텍쳐 (2) | 2022.04.04 |