오라클 성능 고도화 원리와 해법 II (2016년)
조인 제거 0 0 3,125

by 구루비 쿼리변환 조인제거 eliminate_join no_eliminate_join [2017.05.27]


h1.06.조인 제거

  • 조인관계에서 굳이 읽어도 되지 않아도 되는 데이터이면 조인을 제거한다.
    이는 PK, FK 관계가 설정되어 있을 때 작동한다.

예시


select e.empno, e.ename, e.sal, e.hiredate
from dept d, emp e
where d.deptno = e.deptno

-------------------------------------------
| Id  | Operation         | Name | E-Rows |
-------------------------------------------
|   0 | SELECT STATEMENT  |      |        |
|*  1 |  TABLE ACCESS FULL| EMP  |   7013 |
-------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("E"."DEPTNO" IS NOT NULL)

FK가 설정되어있더라도 해당 컬럼이 NULL 허용 컬럼이면 결과가 틀려질 수 있으므로 옵티마이저가 해당컬럼 IS NOT NULL 조건을 추가해준다.

이 기능을 제어하는 파라메터 아래와 같고 eliminate_join, no_eliminate_join 힌트를 통해서도 제어할 수 있다.

alter session set "_optimizer_join_elimination_enabled" = false;

11g 부터는 outer join에서도 이 기능이 작동한다.

select e.empno, e.ename, e.sal, e.hiredate
from dept d, emp e
where d.deptno(+) = e.deptno

-------------------------------------------
| Id  | Operation         | Name | E-Rows |
-------------------------------------------
|   0 | SELECT STATEMENT  |      |        |
|*  1 |  TABLE ACCESS FULL| EMP  |   7013 |
-------------------------------------------

11g부터는 PK와 FK 제약이 설정되어 있으면 아래와 같은 in 또는 서브쿼리도 일반 조인문 제거처럼 제거 된다.

select * from emp e
where deptno in (select /*+eliminate_join(dept)*/ deptno from dept);

select * from emp e
where exists
(select /*elimiate_join(dept)*/ 'x' from dept where deptno = e.deptno);

"구루비 주주클럽 스터디모임" 에서 2016년에 "오라클 성능 고도화 원리와 해법 II " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3362

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입