DB

SQL 레벨업 6장 결합

Bryan Lee 2022. 4. 25. 20:29

 

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 레벨업