실행 계획에서 보면, VIEW Operator를 볼 수 있다. 그러나, 이것은 우리가 흔히 아는 VIEW가 아니다.(NO 상관!)
실행 계획에서의 VIEW는 서브쿼리 중 INNER 쿼리문을 INLINE VIEW로써 실행 계획을 세우겠다는 뜻이다.
ex1)
SELECT e.first_name, e.last_name, dept_locs_v.street_address,
dept_locs_v.postal_code
FROM employees e,
( SELECT /*+ NO_MERGE */ d.department_id, d.department_name, -- /*+ NO_MERGE */ 는 INNER 쿼리에서!
l.street_address, l.postal_code
FROM departments d, locations l
WHERE d.location_id = l.location_id ) dept_locs_v
WHERE dept_locs_v.department_id = e.department_id
AND e.last_name = 'Smith';

ex2는 ex1과 비교해서 /*+ NO_MERGE */ 힌트만 다르다. 그 결과, View Operator가 안 보이는 데... 이는 실행 계획에서,
inline view로 실행하는 것이 아니라 일반적인 equi join으로 실행 하겠다는 뜻이다.
ex2)
SELECT e.first_name, e.last_name, dept_locs_v.street_address,
dept_locs_v.postal_code
FROM employees e,
( SELECT d.department_id, d.department_name,
l.street_address, l.postal_code
FROM departments d, locations l
WHERE d.location_id = l.location_id ) dept_locs_v
WHERE dept_locs_v.department_id = e.department_id
AND e.last_name = 'Smith';

결국, ex2 쿼리문과 ex3 쿼리문은 실질적으로 동일하다.
ex3)
select e.first_name, e.last_name, l.street_address, l.postal_code
from employees e, departments d, locations l
where d.location_id = l.location_id
and d.department_id = e.department_id
and e.last_name = 'Smith';

* GROUP BY와 VIEW Operator
ex4를 보면, 실행 계획을 보면 VIEW가 있다. MERGE(=일반 조인으로 전환)하게 되면, GROUP BY 특성상, 결과 값이 바뀌기 때문에, VIEW Operator를 실행 계획에 추가한 것을 알 수 있다.
ex4)
SELECT V.*,D.DEPARTMENT_NAME FROM (SELECT DEPARTMENT_ID, SUM(SALARY) SUM_SAL
FROM EMPLOYEES GROUP BY DEPARTMENT_ID) V, DEPARTMENTS D
WHERE V.DEPARTMENT_ID=D.DEPARTMENT_ID;

*VIEW PUSH PREDICATE
참고로, ex1의 실행 계획을 보면, VIEW PUSH PREDICATE라는 글자가 보인다.
이것은 Outer 쿼리문 Access Predicate와 Filter Predicate 조건을 Inner 쿼리문의 실행 계획에 강제로 넣는다는 뜻이다.
'개발공부 일지 > 오라클' 카테고리의 다른 글
오라클)계층형 쿼리 CONNECT BY PRIOR , ORDER SIBLINGS BY (0) | 2024.10.29 |
---|---|
오라클) Concatenation Operator (USE_CONCAT 힌트) (0) | 2024.09.01 |
오라클) INSERT ALL 구문 - Pivoting Insert(피봇) (0) | 2024.08.26 |
오라클) 윈도우 함수(Window Function)의 FIRST_VALUE(), LAST_VALUE() 예시 (0) | 2024.08.26 |
오라클) 윈도우 함수(Window Function)의 Interval 키워드 사용법 (0) | 2024.08.26 |
댓글