일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 고전역학
- 리눅스
- python
- 파이썬
- NIO
- 자바암호
- 자바네트워크
- Database
- 웹 크롤링
- android
- 인프라
- flet
- 시스템
- jpa
- 자바
- 코틀린
- kotlin
- chatGPT's answer
- write by chatGPT
- spring data jpa
- 소프트웨어공학
- 데이터베이스
- 유닉스
- JVM
- oracle
- Java
- write by GPT-4
- spring integration
- 역학
- GPT-4's answer
- Today
- Total
기억을 지배하는 기록
Big3 Join 본문
Big3 Join
구분 | Nested Loop Join | Hash Join | Sort Merge Join |
Optimizer Hint | USE_NL(Table | Alias) | USE_HASH(Table | Alias) | USE_MERGE(Table | Alias) |
조인조건 | Any Join | Equal Join 만 가능 | Any Join(주로 Equal Join) |
init.ora Parameter | .DB_BLOCK_BUFFERS .INDEX_COST_ADJUST .OPTIMIZER_INDEX_CACHING | .HASH_JOIN_ENABLED .HASH_AREA_SIZE .HASH_MULTIBLOCK_IO_COUNT | .SORT_AREA_SIZE .DB_FILE_MULTIBLOCK_READ_COUNT |
특징 | - 드라이빙 테이블의 Row 수가 적거나, 조인의 연결 고리에 적절한 액세스 경로가 있는 경우 효율적 - Sort Merge 또는 Hash 조인에 비해 FIRST_ROWS 방식이 효율적 | - 조인 연결 고리 인덱스가 없거나, 조인 집합을 구성하는 검색 조건이 조인 범위를 줄여 주지 못하는 경우 효율적 - 일반적으로 Sort Merge 조인보다 수행 성능이 좋음 | - 조인 연결 고리 인덱스가 없거나, 조인 집합을 구성하는 검색 조건이 조인 범위를줄여 주지 못하는 경우 효율적 - 제한된 메모리로도 실행가능 |
단점 | - 조인 연결 고리 인덱스가 없거나, 조인 집합을 구성하는 검색 조건이 조인 범위를 줄여주지 못할 경우 비효율적 | - HASH 테이블을 위한 많은 CPU, 메모리가 필요 - FIRST_ROWS를 항상 빠르게 출력하는 것은 아님 | - 조인이 되는 두 집합을 모두 정렬해야 함 - FIRST_ROWS 보다는 ALL_ROWS 방식을 위해 설계됨 |
NESTED LOOP JOIN
두 개 이상의 테이블에서 , 하나의 집합을 기준으로 순차적으로 상대방 테이블의 Row를 결합하여 원하는 결과를 추출하는 테이블 연결 방식
결합하기 위해 기준이 되는 테이블 : Driving 테이블
결합되어지는 테이블 : Driven 테이블
NL 조인에서는 드라이빙 테이블의 각 ROW에 대하여 LOOP 방식으로 조인이 되는데 드라이빙 테이블의 집합을 어느 정도 줄일 수 있는가에 따라 NL 조인의 성능이 결정됨
드라이빙 테이블을 적절하게 선택하여 조인의 회수를 줄일 수 있다면 NL 조인이 성능은 훨씬 개선될 것이다.
연결 고리 인텍스에 조인을 한 후, 랜덤 액세스에 의하여 Row 값을 읽음, 인덱스에서 읽은 ROWID에 의해 ROW를 검색하기 위해 한 데이터 블록을 통째로 읽음.
NESTED LOOP JOIN의 단점
데이터를 랜덤 액세스에 의하여 접근하기 때문에 그 결과 집합이 많다면 수행 속도가 저하
드라이빙 테이블은 테이블의 크기가 작거나, WHERE 절 조건을 사용하여 적절히 결과 집합을 제한 할수 있어야 함
연결이 되는 테이블인 드리븐 테이블에는 조인을 위한 적절한 인덱스가 생성되어 있어야 함. 연결 고리가 정상적이지 않은 상태에서는 속도가 현저하게 저하될 수 있으며, 이런 경우 Sort Merge, Hash 조인이 좋음
연결 고리가 되는 컬럼은 Unique 한 속성을 가진 컬럼 인텍스를 이용하거나 분포도가 좋은 컬럼에 대한 인덱스를 이용할수록 수행 속도는 향상됨
HASH JOIN
정력되어 있지 않은 데이터들에 해시 함수를 적용하여 각 자료를 Hadh Bucket으로 나우어 담는다면 같은 값을 가진 자료는 같은 Hash Bucket에 모이게 되어 정력을 수행하지 않고도 보다 효율적으로 상태 집합을 검색 할수 있다.
대용량 처리의 선결조건인 랜덤 액세스와 정렬에 대한 문제 개선과 HW의 선을 개선을 통해 각 조인 집합을 한 번 스캔하여 처리하기 때문에 디스크 액세스 면에서도 훨씬 효율적임
SORT MERGE JOIN
읽혀진 두 테이블의 조인집합은 연결 고리 컬럼에 대하여 각각 정렬을 수행한 후 조인 작업이 수행됨
정렬 수행을 위한 공간은 세션에 정의된 SORT_AREA_SIZE의 크기만큼 메모리를 할당 받아 사용
조인 집합을 정렬하기에 메모리가 부족하다면 정렬 자료가 Temporary 테이블 스페이스에서 정렬을 수행하게 됨 이는 디스크 I/O가 발생하여 성능을 저하시키는 주요 원인이 됨
조인의 연결 고리 정보에 대하여 일치 여부를 빠르게 확인할 수 있는 인덱스가 없기 때문에 두 집합을 정렬하여 지그재그 계단식 비교를 수행함.
두 조인 집합의 크기가 많이 차이 난다면 두 집합을 정렬하는 시간차이가 발생하여 정렬이 완료되기 전까지는 조인 작업을 시작할 수 없기 때문에 대기 시간이 발생함
빠른 응답이 필요한 프로그램에서는 Sort Merge Join 방식을 주로 사용하지 않음
'오래된글 > DataBase' 카테고리의 다른 글
Chapter 2 Oracle 객체 - PLT 2.1 Table (0) | 2018.04.15 |
---|---|
Chapter 1 Oracle Server (0) | 2018.04.15 |
ANSI/X3/SPARC (0) | 2018.04.15 |
Analytical Function (0) | 2018.04.15 |
행을 열로 확장 (0) | 2018.04.15 |