반응형

*조인 제거(Join Elimination) 또는 테이블 제거(Table Elimination)

 - 1:M 관계인 두 테이블을 조인하는 쿼리문에서 조인문을 제외한 어디에서도 1쪽 테이블을 참조하지 않는다면, 쿼리 수행 시 1쪽 테이블은 읽지 않아도 된다. 결과집합에 영향을 미치지 않기 때문이다. 옵티마이저는 이 특성을 이용해 M쪽 테이블만 읽도록 쿼리를 변환하는데, 이를 '조인 제거(Join Elimination)' 또는 '테이블 제거(Table Elimination)'라고 한다.  

 

 - 조인 제거 기능이 작동하려면 PK와 FK 제약이 설정돼 있어야만 한다. 이는 옵티마이저가 쿼리 변환을 수행하기 위한 지극히 당연한 조건이다. 만약 PK가 없으면 두 테이블 간 조인 카디널리티를 파악할 수 없고, FK가 없으면 조인에 실패하는 레코드가 존재할 수도 있어 옵티마이저가 함부로 쿼리 변환을 수행할 수가 없다.

 

- FK가 설정돼 있더라도 emp의 deptno 칼럼이 Null 허용 칼럼이면 결과가 틀리게 될 수 있다. 조인 칼럼 값이 Null인 레코드는 조인에 실패해야 정상인데, 옵티마이저가 조인문을 함부로 제거하면 그 레코드들이 결과 집합에 포함되기 때문이다. 이런 오류를 방지하기 위해 옵티마이저가 내부적으로 E.DEPTNO IS NOT NULL 조건을 추가해 준다. Oracle 10g까지는 조인 제거가 일어나지 않았지만 11g부터 Inner쪽 테이블 제거 기능이 구현되었다.

 

 SELECT E.EMPNO, E.ENAME, E.DEPTNO, E.SAL, E.HIREDATE

 FROM DEPT D, EMP E

 WHERE D.DEPTNO = E.DEPTNO;

 

 ALTER TABLE DEPT ADD

  CONSTRAINT DEPTNO_PK PRIMARY KEY(DEPTNO);

 

 ALTER TABLE EMP ADD

  CONSTRAINT FK_DEPTNO FOREIGN KEY(DEPTNO)

  REFERENCES DEPT(DEPTNO);

 

 SELECT E.EMPNO, E.ENAME, E.SAL, E.HIREDATE

 FROM EMP E, DEPT D

 WHERE D.DEPTNO(+) = E.DEPTNO --- Outer 조인

반응형