구체화된 뷰 (Materialized Views) 이해하기

1. 구체화된 뷰(Materialized View)란 무엇인가?

구체화된 뷰(Materialized View, MV)는 하나 이상의 테이블, 뷰 또는 다른 구체화된 뷰를 기반으로 미리 계산된 결과를 저장하는 데이터베이스 객체입니다. 일반 뷰와 달리 데이터를 실제로 저장하며, 쿼리 성능을 향상시키는 데 사용됩니다. 특히 데이터 웨어하우징 환경이나 복잡한 집계 연산을 필요로 하는 경우 유용합니다.

2. 구체화된 뷰의 주요 특징 및 장점

  • 쿼리 성능 향상: 미리 계산된 결과를 저장하므로, 복잡한 쿼리를 빠르게 수행할 수 있습니다.
  • 쿼리 재작성(Query Rewrite): 옵티마이저는 사용자의 쿼리를 자동으로 재작성하여 구체화된 뷰를 사용하도록 유도할 수 있습니다.
  • 자동 새로 고침(Automatic Refresh): 기본 테이블의 데이터 변경 시 자동으로 구체화된 뷰를 업데이트할 수 있습니다.
  • 다양한 새로 고침 방법: 완전 새로 고침(Complete Refresh), 고속 새로 고침(Fast Refresh), 강제 새로 고침(Force Refresh) 등 다양한 방법으로 뷰를 업데이트할 수 있습니다.

3. 구체화된 뷰 생성 및 관리

3.1. 기본 구체화된 뷰 생성

가장 기본적인 형태의 구체화된 뷰는 다음과 같이 생성할 수 있습니다.

CREATE MATERIALIZED VIEW mv_employees
REFRESH COMPLETE
AS
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
  • CREATE MATERIALIZED VIEW mv_employees: ‘mv_employees’라는 이름으로 구체화된 뷰를 생성합니다.
  • REFRESH COMPLETE: 뷰를 완전 새로 고침 방식으로 업데이트합니다. 이는 뷰를 생성하거나 기본 테이블의 모든 변경 사항이 있을 때마다 뷰의 모든 데이터를 다시 계산합니다.
  • AS SELECT ...: 뷰에 저장될 데이터를 정의하는 쿼리입니다.

3.2. 고속 새로 고침 (Fast Refresh) 가능한 구체화된 뷰 생성

고속 새로 고침은 기본 테이블의 변경 사항만 사용하여 뷰를 업데이트하므로 완전 새로 고침보다 훨씬 효율적입니다. 고속 새로 고침을 사용하려면 기본 테이블에 구체화된 뷰 로그(Materialized View Log)를 생성해야 합니다.

CREATE MATERIALIZED VIEW LOG ON employees
WITH ROWID (department_id, employee_id) INCLUDING NEW VALUES;

이제 고속 새로 고침이 가능한 구체화된 뷰를 생성할 수 있습니다.

CREATE MATERIALIZED VIEW mv_employees_fast
REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1
AS
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
  • REFRESH FAST: 고속 새로 고침 방식으로 뷰를 업데이트합니다.
  • START WITH SYSDATE NEXT SYSDATE + 1: 뷰를 처음에는 즉시 새로 고침하고, 이후 매일(SYSDATE + 1) 업데이트합니다.

3.3. 쿼리 재작성 활성화

쿼리 재작성을 사용하면 옵티마이저는 사용자가 직접 구체화된 뷰를 참조하지 않아도 쿼리를 자동으로 재작성하여 구체화된 뷰를 사용할 수 있습니다. 이 기능은 다음과 같이 활성화할 수 있습니다.

ALTER SESSION SET query_rewrite_enabled = TRUE;
ALTER SESSION SET query_rewrite_integrity = TRUSTED;
  • query_rewrite_enabled: 쿼리 재작성 기능을 활성화합니다.
  • query_rewrite_integrity: 쿼리 재작성에 사용될 무결성 수준을 설정합니다. TRUSTED는 데이터베이스에서 제공하는 무결성 제약 조건을 신뢰한다는 의미입니다.

4. 구체화된 뷰 사용 예제

4.1. 집계 쿼리 성능 향상

다음은 판매 테이블에서 매월 판매 총액을 계산하는 구체화된 뷰를 생성하는 예제입니다.

CREATE MATERIALIZED VIEW mv_monthly_sales
REFRESH COMPLETE
AS
SELECT EXTRACT(YEAR FROM sale_date) AS sale_year,
       EXTRACT(MONTH FROM sale_date) AS sale_month,
       SUM(sale_amount) AS total_sales
FROM sales
GROUP BY EXTRACT(YEAR FROM sale_date), EXTRACT(MONTH FROM sale_date);

이제 사용자가 매월 판매 총액을 요청하는 쿼리를 실행하면, 옵티마이저는 자동으로 이 구체화된 뷰를 사용하도록 쿼리를 재작성하여 훨씬 빠른 결과를 제공합니다.

SELECT sale_year, sale_month, total_sales
FROM mv_monthly_sales
WHERE sale_year = 2023;

4.2. 조인 연산 성능 향상

구체화된 뷰는 여러 테이블에 대한 조인 연산을 미리 계산하여 저장할 수도 있습니다. 다음은 고객 정보와 주문 정보를 조인한 구체화된 뷰의 예입니다.

CREATE MATERIALIZED VIEW mv_customer_orders
REFRESH COMPLETE
AS
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date, o.order_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;

이 뷰를 사용하면 고객 및 주문 정보에 대한 쿼리 성능을 크게 향상시킬 수 있습니다.

5. 구체화된 뷰 튜닝 고려 사항

  • 새로 고침 전략: 뷰의 데이터 변경 빈도와 성능 요구 사항에 따라 완전 새로 고침, 고속 새로 고침 또는 필요 시에만 수동으로 새로 고침을 선택합니다.
  • 인덱스: 구체화된 뷰에 대한 인덱스를 생성하여 쿼리 성능을 더욱 향상시킬 수 있습니다.
  • 파티셔닝: 대규모 구체화된 뷰는 파티셔닝하여 관리 및 쿼리 성능을 개선할 수 있습니다.
  • 저장 공간: 구체화된 뷰는 데이터를 저장하므로, 저장 공간을 충분히 확보해야 합니다.
  • 통계 정보: 옵티마이저가 최적의 실행 계획을 선택할 수 있도록 구체화된 뷰에 대한 통계 정보를 정기적으로 수집합니다.

6. 구체화된 뷰 모니터링

다음 쿼리를 사용해 구체화된 뷰의 새로 고침 상태, 시점, 작업 등의 정보를 확인할 수 있습니다:

SELECT mview_name, last_refresh_type, last_refresh_date, stale_since
FROM user_mviews;

7. 실무 팁

  • 뷰의 목적을 명확히 정의합니다. 뷰가 해결해야 하는 특정 쿼리 또는 보고서를 명확히 정의해야 합니다.
  • 실제 데이터 패턴을 고려합니다. 데이터 분포 및 변경 빈도를 분석하여 가장 적합한 새로 고침 전략을 선택합니다.
  • 테스트 환경에서 성능을 검증합니다. 뷰를 프로덕션 환경에 배포하기 전에 테스트 환경에서 성능을 철저히 검증합니다.
  • 유지보수 계획을 수립합니다. 뷰의 새로 고침 및 인덱스 관리를 위한 주기적인 유지보수 계획을 수립합니다.

8. 결론

구체화된 뷰는 오라클 데이터베이스에서 쿼리 성능을 향상시키기 위한 강력한 도구입니다. 적절한 설계, 관리 및 튜닝을 통해 데이터 웨어하우징 및 OLTP 환경에서 중요한 성능 개선을 얻을 수 있습니다.

9. 추가 자료

위로 스크롤