머지조인(Merge Join)은 조인시 각 테이블을 따로 정렬 후 그 결과를 병합(Merge)하는 집합 연산으로 소트를 동반하므로 소트 머지 조인이라고도 한다. 배치성 JOB에는 효율적이나 OLTP성 업무에는 비효율적일 수 있는데, 모든 ROW를 FETCH한 후 처리할 때까지는 결과를 확인할 수 없는 집합연산을 하기 때문이다.
보통 조인 컬럼에 인덱스가 존재하지 않을 때 나타나며 NESTED LOOP JOIN , HASH JOIN과 달리 실행 계획상에 나타나는 테이블의 순서(드라이빙 테이블이 무엇인지)는 중요하지 않다.
2. Oracle Hint, Tuning_ 실행계획 SQL 연산
3.8 실행계획 SQL 연산
: MERGE JOIN
머지조인(Merge Join)은 조인시 각 테이블을 따로 정렬 후 그 결과를 병합(Merge)
하는 집합 연산으로 소트를 동반하므로 소트 머지 조인이라고도 한다. 배치성 JOB에
는 효율적이나 OLTP성 업무에는 비효율적일 수 있는데, 모든 ROW를 FETCH한 후 처
리할 때까지는 결과를 확인할 수 없는 집합연산을 하기 때문이다.
보통 조인 컬럼에 인덱스가 존재하지 않을 때 나타나며 NESTED LOOP JOIN ,
HASH JOIN과 달리 실행 계획상에 나타나는 테이블의 순서(드라이빙 테이블이 무엇
인지)는 중요하지 않다.
3. Oracle Hint, Tuning_ 실행계획 SQL 연산
-- 현재 옵티마이저 모드는 CBO인 ALL_ROWS 이다.
SQL> SHOW PARAMETER OPTIMIZER_MODE
NAME TYPE VALUE
-------------------------------------------------------------------------------------------
optimizer_mode string ALL_ROWS
-- 인덱스 칼럼에 TO_CHAR 함수를 사용하여 변형을 가해 인덱스를 못쓰도록 하니 RBO인 경우 MERGE JOIN을
한다.
SQL> SELECT /*+ RULE */ COUNT(E.ENAME)
FROM MYEMP1 E, MYDEPT1 D
WHERE TO_CHAR(E.DEPTNO) = TO_CHAR(D.DEPTNO);
COUNT(E.ENAME)
--------------
10000002
경 과: 00:00:39.70
4. Oracle Hint, Tuning_ 실행계획 SQL 연산
Execution Plan
-------------------------------------------------
Id Operation Name
-------------------------------------------------
| 0 | SELECT STATEMENT
| 1 | SORT AGGREGATE
| 2 | MERGE JOIN
| 3 | SORT JOIN
| 4 | TABLE ACCESS FULL MYDEPT1
|* 5 | SORT JOIN
| 6 | TABLE ACCESS FULL| MYEMP1
--------------------------------------------------
-- 이번에는 머지 조인을 하도록 하는 힌트를 사용해 보자. 데이터를 확인할 필요가 없어 SET AUTOTRACE
TRACEONLY EXPLAIN 명령을 사용했다.
SQL> SET AUTOTRACE TRACEONLY EXPLAIN
SQL> SELECT /*+ USE_MERGE(D E) */ E.EMPNO, E.ENAME, D.DNAME
FROM MYEMP1 E, MYDEPT1 D
WHERE E.DEPTNO = D.DEPTNO;
경 과: 00:00:00.00
6. Oracle Hint, Tuning_ 실행계획 SQL 연산
실행계획 SQL 연산
: MERGE SEMI JOIN
세미조인은 서브쿼리를 사용했을 때 메인쿼리와 서브쿼리의 연결을 조인과 유사하
게 연결하는 조인 기법이다. MERGE SEMI JOIN, HASH SEMI JOIN, NESTED LOOP
SEMI JOIN으로 나타나는데 EXISTS와 같은 쿼리에서 서브 쿼리 조건에 대한 인덱스
가 존재하지 않으면 비효율적인 실행 계획이 세워지게 되는데 이러한 경우 세미 조
인을 적절히 이용하면 된다.