뷰 머징(View Merging)의 정의
**뷰 머징(View Merging)**은 SQL 옵티마이저가 쿼리를 최적화하는 과정에서 사용하는 질의 변환(Query Transformation) 기법 중 하나다. 사용자가 작성한 서브쿼리나 뷰(View)를 해체하여 메인 쿼리(Main Query)와 합치는 것을 의미한다.
이를 통해 옵티마이저는 더 넓은 범위의 조인 순서와 인덱스 활용 가능성을 검토할 수 있게 되어, 전체적인 실행 계획의 효율성이 높아진다.
1. 작동 원리
뷰 머징이 발생하면 뷰를 정의했던 인라인 뷰나 서브쿼리의 구조가 사라지고, 그 안에 포함된 테이블들이 메인 쿼리의 FROM 절에 직접 나열된 것처럼 변환된다.
-
변환 전:
SQL
SELECT a.empno, a.ename, b.deptname FROM emp a, (SELECT deptno, deptname FROM dept) b WHERE a.deptno = b.deptno; -
변환 후 (View Merged):
SQL
SELECT a.empno, a.ename, b.deptname FROM emp a, dept b WHERE a.deptno = b.deptno;
2. 뷰 머징의 장점
-
조인 순서 최적화: 뷰 내부에 묶여 있던 테이블이 밖으로 나오면서, 옵티마이저가 메인 쿼리의 다른 테이블들과 조인하는 순서를 더 자유롭게 결정할 수 있다.
-
액세스 경로 다양화: 뷰 내부 조건과 메인 쿼리 조건을 결합하여 최적의 인덱스를 선택할 가능성이 커진다.
3. 뷰 머징이 불가능하거나 제한되는 경우
모든 뷰가 머징될 수 있는 것은 아니다. 다음과 같은 구문이 포함된 경우 옵티마이저는 기본적으로 뷰 머징을 시도하지 않거나 실패한다.
-
집합 연산자 포함 (
UNION,UNION ALL,INTERSECT,MINUS) -
집계 함수 사용 (
SUM,COUNT,AVG등) - 단, ‘Complex View Merging’ 기능을 통해 제한적으로 가능 -
분석 함수 (
Rank,Row_number등) -
DISTINCT 키워드 사용
-
GROUP BY 절 포함
4. 제어 힌트
옵티마이저의 뷰 머징 여부를 수동으로 제어하고 싶을 때 사용한다.
-
MERGE: 뷰 머징을 강제로 수행하도록 유도한다. -
NO_MERGE: 뷰를 합치지 않고 개별적으로 실행하도록 강제한다. (뷰 내부의 독립적인 처리가 유리할 때 사용)
요약하자면, 뷰 머징은 쿼리 블록 간의 벽을 허물어 옵티마이저에게 더 넓은 최적화 시야를 제공하는 핵심 메커니즘이다.
특정 쿼리에서 MERGE 힌트가 필요한 복잡한 뷰 머징 사례에 대해 더 알고 싶은가?