본문 바로가기
개발공부 일지/오라클

오라클) 실행계획에서 VIEW Operator - 뷰 연산자

by Box Cat 2024. 9. 1.
728x90
반응형

실행 계획에서 보면, 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 쿼리문의 실행 계획에 강제로 넣는다는 뜻이다.
 
 

728x90
반응형

댓글