뷰 병합 (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 |
- 엑세스쿼리에 있는 뷰를 원래 테이블인 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 |
- complex_view_merging = enable
- Optimizer_secure_view_merging = enable
출처 : 새로쓴 대용량 데이터베이스 솔루션 vol.1