study:oracle:datadb:3week_1:02
3.2.2. 데이터 연결을 위한 실행계획
- 3.2.2.1. 내포 조인(Nested loops Join)
- 가장 고전적 형태의 조인방식이나 현실적으로 가장 많이 적용
- SINGLE BLOCK I/O
- 전처리 집합의 처리범위가 전체 일량을 좌우
- 다량의 랜덤 액세스 발생
- 따라서 소량의 액세스는 유용, 다량의 액세스는 큰 부하 발생
- NESTED LOOPS JOIN = 내포조인 = 중첩루프조인
- 진보된 내포조인(Advanced Nested Loop Join)
- 클러스터링 팩터가 좋다면, 많은 부분을 한번의 블록 액세스에서 연결가능
- 물리적, 논리적 블록 액세스 량이 감소 → 효율성 증대
- DBMS 또는 버전별로 차등 지원
- 3.2.2.2. 정렬 병합 조인(Sort Merge Join)
- NESTED LOOPS JOIN의 문제점을 해결하기 위한 방안
- NESTED LOOPS JOIN의 문제점
- 조인 대상 범위가 넓을 경우 랜덤 액세스 발생
- 연결고리 이상으로 인한 다량의 액세스 발생
- SORT MERGE JOIN의 특징
- 랜덤액세스를 하지 않고 스캔으로 수행
- 최소한 두 개의 집합의 연결 고리는 필요
- 정렬을 대신 할수 있는 인덱스가 존재할 경우 부하 감소
- 연결고리에 인덱스 유무가 문제되지 않음
- SORT 부하 발생
- SORT AREA SIZE에 따른 효율성 차이 발생
- 해쉬조인에 비해
- 이미 정렬된 집합이 존재
- 인덱스를 활용한 정렬 대체가 가능할 경우 높은 효율성 보장 가능
- Nested Loop 조인에 비해
- =(EQUAL)이 아닌 (LIKE, BETWEEN, <. ⇐, >, >
일 경우 유리할 수 있음
- 선행 집합 개념이 없음으로 선행처리 개념이 불필요
- 각 집합이 독립적인 처리 수행
- 3.2.2.3. 해쉬 조인(Hash Join)
- 해쉬 함수 기법을 적용하여 조인 수행
- 조인 기법의 진화
- NESTED LOOPS JOIN : 랜덤 액세스 부하 발생
- SORT MERGE JOIN : 데이터량의 증가에 따른 정렬 부하 발생
- HASH JOIN : 랜덤 액세스와 정렬의 부하 감소
- 해쉬 함수의 특징
- 대량 범위에 대한 조인에 유리
- 연결 대상을 특정 지역(PARTITION) 구분
- PARTIION : 동일 해쉬 값을 보유한 데이터들을 모아둔 공간
- PARITION PAIR : 조인 대상에 대한 연결
- IN MEMORY HASH가 가능한 경우 빠른 수행속도 보장
- (한쪽 집합이 해쉬영역보다 작을 경우)
- 연산자의 제약 : ‘=‘(EQUAL) 조인만 가능
- 3.2.2.4. 세미 조인(Semi Join)
- 세미조인이란?
- 서브쿼리가 다양한 연산자에 의해 메인 쿼리와 연결되는 경우(廣義의 의미)
- 조인과 서브쿼리의 비교
- 조인 : 조인되는 집합간 수행 순서에 관계없이 논리적으로는 수평적 관계
- 서브쿼리 : 메인쿼리의 집합의 변형이 없는 수직적(종속적)관계
- 메인쿼리와 서브쿼리간의 관계 차수에 따른 실행계획
- 메인쿼리 : 서브쿼리 = M : 1의 관계?
- 옵티마이져는 조인과 동일한 실행계획 수립
- 메인쿼리 : 서브쿼리 = 1 : M의 관계?
- 옵티마이져는 서브쿼리를 1의 집합으로 만들기 위한 중간 처리 수행
- 제공자 역할의 서브쿼리일 경우 SORT(UNIQUE) 처리
- 확인자 역할의 서브쿼리일 경우 FILTER 형 처리
- 힌트의 사용
- ORACLE 10G 이전
- MERGE_SJ, MERGE_AJ, HASH_SJ, HASH_AJ을 사용
- ORACLE 10G 이후
- 서브쿼리에 USE_HASH, USE_MERGE
- 3.2.2.5. 카티젼 조인(Cartesian Join)
- 조인이 되는 두 개의 집합간에 연결고리 조건이 전혀 없는 경우
- M:M 조인을 의미
- 실행계획의 특징
- SORT MERGE JOIN만이 CARTESIAN 실행계획 명기
- 타 JOIN의 경우 정상적인 조인의 실행계획으로 표기, 단 결과상 확인 가능
- 카티젼 조인(CARTESIAN JOIN)의 발생 원인
- 쿼리 생성자의 실수
- 사용자가 특별한 목적하에 고의적인 카티젼 조인 발생
- 3개 이상의 집합 조인시 조인 순서의 잘못으로 발생
- 3.2.2.6. 아우터 조인(Outer Join)
- 아우터 조인(OUTER JOIN)
- 외측 루프는 언제나 보존되고, 내측 루프는 선택적인 조인
- 아우터 조인(Outer Join)의 종류
- NESTED LOOPS 아우터 조인
- 주의사항
- OUTER LOOP : 기준/보존 집합
- INNER LOOP : OUTER LOOP의 결과 집합 영향을 주지 않도록 수행
- USE_NL(TABLE1, TABLE2)
- NESTED LOOPS(OUTER)
- 해쉬 아우터 조인
- Hash Function을 이용해서 메모리와 CPU를 많이 사용해서 일반적으로 배치작업에서 주로 사용됨
- /*+ use_hash(테이블) */
- 적은테이블과 큰테이블의 조인시에 유리
- Equal 조인에서만 가능
- Driving Table에 인덱스를 필요로 하지 않고 각 테이블을 한번만 읽음
- 다른조인방법보다 CPU자원을 많이 소비하며 양쪽 테이블의 scan이 동시에 일어남
- SORT MERGE 아우터 조인
- 선택 조건
- NESTED LOOPS 조인으로는 부담이 되는 대량의 데이터 또는 인덱스 문제가 있는 경우
- 조건 연산자로 인해 HASH 조인이 불가능 할 경우
- 이미 다른 처리에 의해 조인을 위한 정렬이 선행되어 있는 경우
- 전체 아우터 조인
- 조인에 참여하는 양 집합이 모두 기준집합이며 대응집합일 경우
- 수행방식
- 한 쪽을 기준으로 아우터 조인을 수행한 결과
- 다른 쪽을 기준으로 부정형 조인을 할 결과
- 위 두 집합을 UNION ALL
- 3.2.2.7. 인덱스 조인
- 인덱스 조인
- 테이블 엑세스 없이 하나 이상의 인덱스들을 결합하여 쿼리를 수행
- 인덱스 조인의 특징
- 사용된 모든 컬럼이 어떤 인덱스에라도 존재
- 비교 연산자가 ‘=’이 아니어도 인덱스 조인에 참여 가능
- 반드시 인덱스의 선두 컬럼이 아니어도 인덱스 조인에 참여 가능
- 조건절을 기준으로 인덱스 조인을 결정
- 인덱스 조인이 논리적으로 가능하다고 해서 항상 발생되는 것은 아님
- 실행계획상에는 해쉬 조인으로 수행되는 것으로 보임
study/oracle/datadb/3week_1/02.txt · 마지막으로 수정됨: 저자 gwgwg
