2011년 6월 1일 수요일

Big3 Join

Big3 Join

구분Nested Loop JoinHash JoinSort Merge Join
Optimizer
Hint
USE_NL(Table | Alias)USE_HASH(Table | Alias)USE_MERGE(Table | Alias)
조인조건Any JoinEqual 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 방식을 주로 사용하지 않음

댓글 없음:

댓글 쓰기

시스템 부팅시 도커 컨테이너 자동 실행

Docker 컨테이너를 운용중인 시스템이 Reboot 되버리면 컨테이너가 자동으로 올라오지 않아 불편해서 시스템 리붓시 컨테이너를 자동으로 시작되게 init 데몬에 등록하기로 했습니다. 서버는 Ubuntu 17.10 Docker는 17.0...