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

 

 

 

 

 

'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