조인 제거란
- 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 힌트를 통한 제어도 가능 )
'ORACLE > SQLP' 카테고리의 다른 글
성능고도화 4-8. 공통 표현식 제거 (0) | 2016.12.26 |
---|---|
성능고도화 4-7. Or-expansion (0) | 2016.12.26 |
성능고도화 4-5. 조건절 이행 (0) | 2016.12.26 |
성능고도화 4-4. 조건절 Pushing (0) | 2016.12.26 |
성능고도화 4-3. 뷰 Merging (0) | 2016.12.26 |