구체화된 뷰란 무엇인가?
구체화된 뷰(Materialized View) 생성문에서 SELECT 절은 해당 뷰에 포함시킬 데이터를 정의합니다. 정의할 수 있는 대상에는 일부 제약이 있지만, 여러 개의 테이블을 하나로 조인하는 것은 허용됩니다. 일반 뷰, 인라인 뷰(SELECT 문의 FROM 절 안에 위치한 서브쿼리), 서브쿼리, 그리고 이미 존재하는 다른 구체화된 뷰까지 모두 SELECT 절에서 조인하거나 참조할 수 있습니다.
구체화된 뷰는 용도와 구성 방식에 따라 크게 세 가지 유형으로 나눌 수 있습니다.
1. 집계(Aggregates)를 포함한 구체화된 뷰
데이터 웨어하우스 환경에서 구체화된 뷰에는 일반적으로 집계 함수가 포함됩니다. 빠른 새로 고침(Fast Refresh)이 가능하려면 SELECT 목록에 GROUP BY 절의 모든 컬럼이 반드시 포함되어야 하며, 집계 대상 컬럼에 대해 COUNT(*)와 COUNT(column)가 함께 존재해야 합니다.
또한 구체화된 뷰를 정의하는 쿼리에서 참조되는 모든 테이블에는 구체화된 뷰 로그(materialized view log)가 생성되어 있어야 합니다. 사용할 수 있는 실제 집계 함수로는 SUM, COUNT(x), COUNT(*), AVG, VARIANCE, STDDEV, MIN, MAX가 있으며, 집계 대상 표현식은 유효한 SQL 값 표현식이면 됩니다.
2. 조인(Joins)만 포함한 구체화된 뷰
일부 구체화된 뷰는 집계 없이 조인만으로 구성됩니다. 예를 들어 판매(sales) 테이블을 시간(times) 테이블과 고객(customer) 테이블에 조인하는 구체화된 뷰를 만들 수 있습니다. 이러한 유형의 구체화된 뷰를 사용하면 비용이 많이 드는 조인 연산을 미리 계산해 두고 재사용할 수 있다는 큰 장점이 있습니다.
조인만 포함한 구체화된 뷰의 빠른 새로 고침은 베이스 테이블에 대한 모든 유형의 DML(직접 경로 또는 일반 방식의 INSERT, UPDATE, DELETE) 이후에 적용될 수 있습니다. 이러한 구체화된 뷰는 ON COMMIT 또는 ON DEMAND 방식으로 새로 고침되도록 설정할 수 있으며, ON COMMIT으로 지정하면 기반 테이블에 DML을 수행한 트랜잭션이 커밋되는 시점에 새로 고침이 실행됩니다.
ROWID 및 원격 테이블 관련 제약 조건
구체화된 뷰가 조인만 포함하는 경우, FROM 목록에 등장하는 각 테이블(그리고 여러 번 등장하는 테이블이라면 각 인스턴스마다)의 ROWID 컬럼이 반드시 구체화된 뷰의 SELECT 목록에 포함되어야 합니다.
FROM 절에 원격(remote) 테이블이 있는 경우에는 FROM 절의 모든 테이블이 동일한 사이트에 위치해야 합니다. 아울러 원격 테이블을 포함한 구체화된 뷰에는 ON COMMIT 새로 고침이 지원되지 않습니다. 원격 사이트에는 구체화된 뷰의 각 디테일 테이블에 대한 구체화된 뷰 로그가 존재해야 하며, ROWID 컬럼 역시 구체화된 뷰의 SELECT 목록에 포함되어야 합니다.
3. 중첩된(Nested) 구체화된 뷰
중첩된 구체화된 뷰란 그 정의가 다른 구체화된 뷰 위에 구축된 구체화된 뷰를 의미합니다. 중첩된 구체화된 뷰는 데이터베이스 내의 다양한 관계(relation)를 참조할 수 있으며, 여기에는 다른 구체화된 뷰에 대한 참조도 포함됩니다.
데이터 웨어하우스에서는 하나의 조인 위에 여러 개의 집계 뷰를 만드는 경우가 흔합니다(예: 여러 차원을 따라 롤업하는 경우). 이렇게 서로 다른 구체화된 집계 뷰들을 증분 방식으로 지원하려면 기본 조인을 여러 번 반복 수행해야 하므로 상당히 오랜 시간이 소요될 수 있습니다. 중첩된 구체화된 뷰를 활용하면 이러한 반복 연산을 줄여 전체적인 성능을 개선할 수 있습니다.