출처
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);