ORACLE Tip2008. 11. 13. 10:00

뷰 병합 (View Merging) 
: 뷰쿼리를 엑세스쿼리에 병합해 넣는 방식

* 일반적인 뷰병합

 뷰  뷰쿼리  뷰병합
 CREATE VIEW emp_10
(e_no, e_name, job, manager,
salary, commission, deptno)
AS
SELECT empno, ename, job, mgr, sal,
 comm, deptno
FROM emp
WHERE deptno = 10;
SELECT e_no, e_name, salary, deptno
FROM emp_10
WHERE salary > 1000000;

SELECT empno, ename, sal, hiredate
FROM emp
WHERE deptno = 10
  AND sal > 1000000;

엑세스쿼리를 기준으로 뷰쿼리의 대응인자를 병합
- 엑세스쿼리에 있는 뷰를 원래 테이블인 emp로 변환
- 남아있는 조건절을 다시 엑세스쿼리에 병합
- 컬럼들도 대응되는 원래 테이블의 컬럼들로 병합

* View Merging이 불가능한 경우 : 엑세스쿼리에 있는 조건들을 뷰쿼리에 진입(Pushing predicate)
- 집합연산(UNION, UNION ALL, INTERSECT, MINUS)
- CONNECT BY
- ROWNUM을 사용한 경뷰우
- SELECT-List의 그룹함수(AVG, COUNT, MAX, MIN, SUM)
- GROUP BY , SELECT-List의 DISTINCT : 단, Merge힌트를 사용했거나 관련 파라미터가 Enable이면 뷰 병합 가능

* Pushing predicate : 뷰병합을 할 수 없는 경우를 대상으로 뷰쿼리 내부에 엑세스쿼리의 조건절을 진입
 뷰 뷰쿼리  뷰병합 
 CREATE VIEW emp_union_view
 (e_no, e_name, job, mgr, sal, comm, deptno)
AS
 SELECT empno, ename, job, mgr, sal, comm, deptno
 FROM regular_emp
 UNION ALL
 SELECT empno, ename, job, mgr, sal, comm, deptno
 FROM temporary_emp
SELECT e_no, e_name, mgr, sal
FROM emp_union_view
WHERE deptno = 20;
 SELECT empno, ename, mgr, sal
FROM (
   SELECT empno, ename, mgr, sal
   FROM regular_emp
   WHERE detpno = 20
   UNION ALL
   SELECT empno, ename, mgr, sal
   FROM temporary_emp
   WHERE 90 = 20

* GROUP BY 뷰의 병합 (Pushing predicate Merge)
 뷰 뷰쿼리  뷰병합 
CREATE VIEW emp_group_by_deptno
AS
SELECT deptno, AVG(sal) avg_sal, MIN(sal) min_sal, MAX(sal) max_sal
FROM emp
GROUP BY deptno
SELECT e_no, e_name, mgr, sal FROM emp_group_by_deptno WHERE deptno = 10 SELECT deptno, AVG(sal) avg_sal, MIN(sal) min_sal, MAX(sal) max_sal
FROM emp
WHERE deptno = 10;
GROUP BY deptno   
위의 작업이 가능하려면 아래의 파라미터가 Enable 되어야 한다.
- complex_view_merging = enable
- Optimizer_secure_view_merging = enable

출처 : 새로쓴 대용량 데이터베이스 솔루션 vol.1

Posted by 항아리고미