본문 바로가기
데이터베이스

뷰 병합(View Merging)

by 다시쓰는 2023. 9. 30.
반응형

뷰 병합(View Merging)은 데이터베이스에서 뷰를 사용하는 쿼리 최적화 과정 중 하나이다.

뷰는 하나 이상의 기본 테이블을 기반으로 정의된 가상 테이블로 뷰를 쿼리할 때 뷰의 정의에 따라 기본 테이블들의 데이터를 조회할 수 있다.

 

뷰 병합은 아래와 같은 상황에서 발생한다.

1. 뷰간의 병합 (View-to-View Merge) : 여러 개의 뷰가 쿼리에서 사용될 때, 옵티마이져는 가능하다면 뷰를 병합하여 하나의 뷰로 처리한다. 이렇게 하면 쿼리의 실행 계획이 단순화되고 성능이 향상된다.

2. 뷰와 기본 테이블의 병합(View-to-Table Merge) : 쿼리에서 뷰와 뷰의 기본 테이블을 함께 사용할 때, 옵티마이져는 뷰와 기본 테이블을 하나의 쿼리로 합칠 수 있으면 합친다. 이를 통해 중간 결과 집합이 줄어들고 성능이 향상될 수 있다.

 

뷰 병합 (View Merging) 은 쿼리 최적화의 일환으로 수행되며, 실행 계획을 최적화하여 쿼리의 성능을 최적화하는 데 사용된다. 그러나 뷰 병합이 항상 가능한 것은 아니며, 다음과 같은 제한 사항이 존재할 수도 있다.

 - 뷰의 정의가 병합 가능한 형태여야 한다. 뷰 간에 조인 연산이나 집계 함수 등이 포함된 경우에는 뷰 병합이 어렵다.

 - 뷰와 기본 테이블 사이의 조인 조건이나 필터링 조건이 일치해야 한다.

 - 데이터베이스 시스템과 버전에 따라 뷰 병합이 지원되지 않을 수 있다.

 

뷰를 사용하는 쿼리는 크게 뷰쿼리와 엑세스 쿼리로 나누어진다.

 뷰쿼리란 우리가 뷰를 생성할 때 사용한 SELECT문, 딕셔너리에 저장되어 있는 SELECT문을 말하며, 엑세스 쿼리란 이뷰를 수행하는 SQL을 말한다.

 FROM 절에 괄호를 묶어 둔 SELECT는 뷰쿼리이며, 인라인뷰의 바같에 있는 SELECT를 엑세스 쿼리라고 할 수 있다.

 뷰의 엑세스를 최적화하기 위해서는 뷰쿼리에 사용된 원래의 테이블을 엑세스하도록 문장을 변환시켜야 한다. 이를 위해 뷰 쿼리와 엑세스 쿼리를 병합하는 방법은 두 가지 형식이 있다.

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

 - 조건절 진입(Predicate pushing)법 : 뷰병합을 할 수 없는 경우를 대상으로 뷰쿼리 내부에 엑세스쿼리의 조건절을 진입시키는 방식

 

 옵티마이져는 뷰쿼리를 엑세스쿼리로 병합하기 위해서 엑세스 쿼리에 있는 뷰의 이름을 뷰쿼리의 원래의 테이블로 이름을 변경하고 뷰의 WHERE절에 있는 조건절을 엑세스 쿼리의 WHERE절에 추가한다.

 

CREATE VIEW EMP_10 (E_NO, E_NAME, JOB, MANAGER, HIRE_DATE, SALARY, COMMISSION, DEPTNO) AS

SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO

FORM EMP

WHERE DEPNO = 1000

 

뷰쿼리

SELECT E_NO, E_NAME, SALARY, HIRE_DATE

FROM EMP_10

WHERE SALARY > 1000000

 

엑세스쿼리에다 병합을 하면

SELECT EMPNO, ENAME, SAL, HIREDATE

FROM EMP

WHERE DEPTNO = 1000

AND SAL > 1000000

 

뷰 병합이 불가능한 조건

- 집합 연산(UNION, UNION ALL, INTERSECT, MINUS)

- CONNECT BY

- ROWNUM 을 사용한 경우

- SELECT-List 의 집계함수 (AVG, COUNT, MAX, MIN, SUM) *GROUP BY 없이 전체를 집계하는 경우를 말함

- GROUP BY (단 Merge 힌트를 사용했거나 관련 파라메터가 ENABLE이면 뷰병합 가능)

- SELECT-List의 DISTINCT (단 Merge 힌트를 사용했거나 관련 파라메터가 ENABLE이면 뷰병합 가능)

 

 

 

반응형