뷰 머징(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 힌트가 필요한 복잡한 뷰 머징 사례에 대해 더 알고 싶은가?