일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- SQL 기본 및 활용
- SQLD SQL 최적화 기본 원리
- SQLD SQL 활용
- 자바 DP 예제
- SQLD 내용 정리
- 백준 1141 로직
- 백준 부분합 로직
- SQLD 책
- 자바 이분 탐색 예제
- 백준 2293 자바
- 오라클 예제
- 백준 예산 코드
- 자바 예제
- SQLD 정리
- 백준 1141 접두사
- 백준 예산 자바
- 백준 1141
- SQLD 내용
- 자바 문자열 예제
- 백준 2512 자바
- 알고리즘
- 너비우선탐색
- 백준 2293 동전 1
- BFS
- 백준 동전1 자바
- SQLD
- SQLD 요약
- 백준 접두사 자바
- 백준
- 백준 접두사 로직
- Today
- Total
혼자 공부하는 공간
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 최적화 기본 원리 #3 본문
<목차>
<< 조인 수행 원리 >>
* 조인이란 두 개 이상의 테이블을 하나의 집합으로 만드는 연산이다.
* SQL 문에서 FROM 절에 두 개 이상의 테이블이 나열될 경우 조인이 수행된다.
ex) A, B, C 테이블을 조인할 때, A와 B 테이블이 먼저 조인되고 조인된 결과와 C 테이블이 다시 조인되는 방식이다.
---> 이 때, 각 조인별로 다른 조인 기법을 사용할 수 있다.
1. NL JOIN
* 프로그래밍에서 사용하는 중첩된 반복문(Nested Loop)과 유사한 방식으로 조인을 수행.
* 반복문에서 외부에 있는 테이블을 선행 테이블(Driving Table) 또는 외부 테이블(Outer Table)이라하고 하고, 반복문의 내부에 있는 테에블을 후행 테이블(Lookup Table) 또는 내부 테이블(Inner Table)이라고 한다.
A. 수행 방식
-
선행 테이블에서 주어진 조건을 만족하는 행을 찾음.
-
선행 테이블의 조인 키 값을 가지고 후행 테이블에서 조인을 수행
-
선행 테이블의 조건을 만족하는 모든 행에 대해 1번 작업 반복 수행
* 선행 테이블의 조건을 만족하는 행의 수가 많으면, 그 만큼 후행 테이블의 조인 작업이 반복된다.
---> 따라서 결과 행의 수가 적은 테이블을 조인 순서상 선행 테이블로 선택하는 것이 전체 일량을 줄일 수 있다.
---> NL JOIN은 랜덤 방식으로 데이터를 액세스하기 때문에 처리 범위가 좁은 것이 유리하다.
* 조인 칼럼에 적당한 인덱스가 있어서 NATURAL JOIN이 효율적일 때 사용된다.
* 유니크 인덱스를 활용하여 수행 시간이 적게 걸리는 소량 테이블을 조회하는 경우 유용하다.
* 위 그림을 예로 수행 방식을 알아보자.
-
선행 테이블에서 조건을 만족하는 첫 번째 행을 찾는다.
---> 이때 선행 테이블에 주어진 조건을 만족하지 않는 경우 해당 데이터는 필터링 됨.
-
선행 테이블의 조인 키를 가지고 후행 테이블에 조인 키가 존재하는지 찾으러 간다. -- 조인 시도
-
후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인
---> 선행 테이블의 조인 키가 후행 테이블에 존재하지 않으면 선행 테이블 데이터는 필터링 됨.
-
인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블 액세스
---> 인덱스 스캔을 통한 테이블 액세스. 후행 테이블에 주어진 조건까지 만족하면 해당 행을 추출 버퍼에 넣는다.
-
- 11. 앞의 작업을 반복한다.
* 추출 버퍼는 SQL 문의 실행 결과를 보관하는 버퍼로 일정 크기를 설정하여 추출 버퍼에 결과가 모두 차거나 더 이상 결과가 없어서 추출 버퍼를채울 것이 없으면 결과를 사용자에게 반환한다.
2. Sort Merge JOIN
* 조인 칼럼을 기준으로 데이터를 정렬하여 조인을 수행한다. NL JOIN은 주로 랜덤 액세스 방식으로 데이터를 읽는 반면에 Sort Merge JOIN은 주로 스캔 방식으로 데이터를 읽는다.
* 정렬할 데이터가 많아 메모리에서 모든 정렬 작업을 수행하기 어려운 경우에는 임시 영역을 사용하기 때문에 성능이 떨어질 수도 있다.
* 일반적으로 대량의 조인 작업에서는 Sort Merge JOIN 보다는 Hash JOIN이 성능상 유리하다.
* Sort Merge JOIN은 Hash JOIN과 달리 동등 조인 뿐만 아니라 비동등 조인에 대해서도 작업이 가능하다는 장점이 있다.
* 조인 조건의 인덱스의 유무에 영향을 받지 않으며, Driving Table의 개념이 중요하지 않다.
A. 수행 방식
* 위 그림을 예로 수행 방식을 알아보자.
-
선행 테이블에서 주어진 조건을 만족하는 행을 찾음.
-
선행 테이블의 조인 키를 기준으로 정렬 작업을 수행. 1,2 작업을 선행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행.
-
후행 테이블에서 주어진 조건을 만족하는 행을 찾음.
-
후행 테이블의 조인 키를 기준으로 정렬 작업을 수행. 3, 4 작업을 후행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행.
-
정렬된 결과를 이용하여 조인을 수행하며 조인에 성공하면 추출 버퍼에 넣음.
* 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않는 경우에도 사용할 수 있다.
* 이미 정렬되었다면 정렬 작업은 발생하지 않을 수도 있다.
3. Hash JOIN
* Hash 기법을 이용한 조인 방법.
* 조인을 수행할 테이블의 조인 칼럼을 기준으로 해쉬 함수를 수행하여 서로 동일한 해쉬 값을 갖는 것들 사이에엇 실제 값이 같은지를 비교하면서 조인을 수행한다.
* NL JOIN의 랜덤 액세스 문제와 Sort Merge JOIN의 정렬 작업의 부담의 문제를 해결하기 위해 등장했다.
* 위 그림을 예로 수행 방식을 알아보자.
-
선행 테이블에서 주어진 조건을 만족하는 행을 찾음.
-
선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블을 생성
---> 조인 칼럼과 SELECT 절에서 필요로 하는 칼럼도 함께 저장됨
---> 1, 2번 작업을 선행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행 -
후행 테이블에서 주어진 조건을 만족하는 행을 찾음.
-
후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 찾음
---> 조인 키를 이용해서 실제 조인될 데이터를 찾는다. -
조인에 성공하면 추출 버퍼에 넣음
---> 3 ~ 5번 작업을 후행 테이블의 조건을 만족하는 모든 행에 대해서 반복 수행
* Hash 조인은 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 때에도 사용할 수 있다.
*
* 해쉬 함수를 통해 조인을 수행하기 때문에 '='로 수행하는 조인(동등 조인) 에서만 사용할 수 있다.
* 동일 한 값에 대해서 같은 해쉬 값을 보장한다.
* 해쉬 테이블은 메모리에 생성해야 한다.
---> 메모리에 적재될 수 있는 크기보다 커지면 임시 영역에 해쉬 테이블을 저장한다.
---> 해쉬 테이블의 크기를 작게 설정하기 위해 결과가 적은 테이블을 선행 테이블로 사용하는 것이 좋다.
'자격증 > SQLD' 카테고리의 다른 글
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 최적화 기본 원리 #2 (0) | 2020.09.01 |
---|---|
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 최적화 기본 원리 #1 (0) | 2020.09.01 |
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #8 (0) | 2020.09.01 |
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #7 (0) | 2020.09.01 |
[SQL기본 및 활용] 2020년 SQLD 내용 정리 :: SQL 활용 #6 (0) | 2020.08.31 |