조인 제거란 

 - 1:M 관계인 두 테이블을 조인하는 쿼리문에서 조인문을 제외한 어디에서도 1쪽 테이블을 

   참조하지 않는다면, 쿼리 수행 시 1쪽 테이블은 읽지 않아도 결과집합에 영향을 미치지 

   않기 때문에 옵티마이저는 이 특성을 이용해 M쪽 테이블만 읽도록 쿼리를 변환하는데, 

   이를 '조인 제거' 또는 '테이블 제거'라고 한다. 

 - 이러한 쿼리 변환은 오라클의 경우 10g 부터 작동하기 시작했지만 SQL Server 등에서는 

   이미 오래 전부터 적용돼 온 기능이다. 

 - 이 기능을 제어하는 파라미터는 아래와 같고, 힌트를 통해 쿼리 레벨에서 제어할 수도 있다. 

     ● eliminate_join, no_eliminate_join 

 - 조인 제거 기능이 작동하려면 아래와 같이 PK 와 FK 제약이 설정돼 있어야만 한다. 

 - FK가 설정 되어 있더라도 FK 쪽 컬럼이 null 허용 컬럼이면 결과가 틀리게 될 수 있다. 

   조인 컬럼 값이 null인 레코드는 조인에 실패해야 정상인데, 옵티마이저가 조인문을 

   함부로 제거하면 그 레코드들이 결과집합에 포함되기 때문이다. 그런 오류를 방지하기 위해

   옵티마이저가 내부적으로 e.deptno is not null 조건을 추가해 준다. 

 - 11g부터 PK와 FK 제약이 설정돼 있으면 아래와 같은 in 또는 exists 서브쿼리도 일반 조인문

   처럼 제거된다. 

   ( _optimizer_join_elimination_enabled 파라미터에 의해 영향을 받고, 

     eliminate_join, no_eliminate_join 힌트를 통한 제어도 가능 )  

+ Recent posts