본문 바로가기
Developer/DB

[DB] FULL OUTER JOIN

by 순수한소년 2020. 7. 13.
728x90
반응형

출처

https://opentutorials.org/course/195/1409

 

JOIN - 생활코딩

여러개의 테이블 사용하기 데이터의 규모가 커지면서 하나의 테이블로 정보를 수용하기가 어려워지면 테이블을 분활하고 테이블 간의 관계성을 부여한다. 예제 DROP TABLE IF EXISTS `student`; CREATE TAB

opentutorials.org

 

http://wiki.gurubee.net/pages/viewpage.action?pageId=26746341

 

2.12 FOJC(Full Outer Join Conversion) Full Outer 조인을 Union All로 변경하라 - [종료]구루비 DB 스터디 - 개발�

Added by 이정헌, last edited by 이정헌 on 6월 14, 2013  (view change) 2.12 FOJC* (Full Outer Join Conversion) : Full Outer 조인��

wiki.gurubee.net

출처

2.12 (Full Outer Join Conversion) : Full Outer 조인을 Union All로 변경하라 

Full Outer Join의 일반적인 개념 
하나의 테이블 기준으로 Outer Join을 한다. 
Union 
반대편 테이블을 기준으로 다시 Outer Join을 한다. 
(Union이 Union All로 바뀜) 
_optimizer_native_full_outer_join 
full outer join 발생시 이 파라미터가 off 이면(10g) 문장은 
두개의 쿼리블럭(left outer join 과 anti join)으로 나뉘어져 union all 되게 변환된다. 
이 파라미터를 force 로 두면(11g) anti join 부분이 제거되어 성능이득이 있다. 
이 기능을 Native Full Outer Join 이라 하며 2.13 장에 소개된다 
_optimizer_native_full_outer_join = OFF; 
alter session set "_optimizer_native_full_outer_join" = OFF; 

ALTER SESSION SET EVENTS '10053 trace name context forever, level 1'; 

SELECT a.employee_id, a.first_name, a.last_name, a.email, b.department_name 
  FROM employee a FULL OUTER JOIN department b 
    ON (a.department_id = b.department_id) ; 

ALTER SESSION SET EVENTS '10053 trace name context off'; 

윗부분은 분명히 Outer 조인으로 풀렸지만 아랫부분은 Anti 조인으로 풀렸으므로 
이것은 서브쿼리를 사용한 것이다 
즉,옵티마이져는 Full Outer Join을 아래처럼 Union All로 재작성한 것이다 

SQL변환 
explain plan for 
SELECT * 
  FROM (SELECT a.employee_id, a.first_name, a.last_name, a.email, b.department_name 
          FROM employee a, department b 
         WHERE a.department_id = b.department_id(+) 
        UNION ALL 
        SELECT NULL, NULL, NULL, NULL, b.department_name 
          FROM department b 
         WHERE NOT EXISTS (SELECT 1 
                             FROM employee a 
                            WHERE a.department_id = b.department_id) 
       ); 

select * from table(dbms_xplan.display); 

728x90
반응형