🗄️ 데이터베이스

머티리얼라이즈드 뷰

Materialized View

결과가 저장된 뷰. 주기적 갱신, 빠른 조회.

📖 상세 설명

머티리얼라이즈드 뷰(Materialized View)는 쿼리 결과를 물리적으로 저장하는 데이터베이스 객체입니다. 일반 뷰는 조회 시마다 쿼리를 실행하지만, 머티리얼라이즈드 뷰는 미리 계산된 결과를 테이블처럼 저장하여 빠르게 조회할 수 있습니다.

주요 사용 사례: 복잡한 집계(대용량 리포팅), 조인 비용 절감(자주 조회되는 조인 결과 저장), 데이터 웨어하우스(ETL 결과 캐싱), 읽기 성능 최적화.

갱신 방식: 완전 갱신(REFRESH COMPLETE - 전체 재계산), 증분 갱신(REFRESH FAST - 변경분만 적용, 제한 조건 있음). PostgreSQL에서는 REFRESH MATERIALIZED VIEW CONCURRENTLY로 조회 중에도 갱신 가능합니다.

💻 코드 예제

-- PostgreSQL: 머티리얼라이즈드 뷰 생성
CREATE MATERIALIZED VIEW monthly_sales_summary AS
SELECT
    DATE_TRUNC('month', order_date) AS month,
    product_id,
    SUM(quantity) AS total_quantity,
    SUM(amount) AS total_amount,
    COUNT(*) AS order_count
FROM orders
GROUP BY DATE_TRUNC('month', order_date), product_id;

-- 고유 인덱스 추가 (CONCURRENTLY 갱신에 필요)
CREATE UNIQUE INDEX idx_monthly_sales ON monthly_sales_summary(month, product_id);

-- 조회 (매우 빠름 - 이미 계산된 결과)
SELECT * FROM monthly_sales_summary
WHERE month >= '2024-01-01';

-- 수동 갱신
REFRESH MATERIALIZED VIEW monthly_sales_summary;

-- 동시 접근 허용 갱신 (인덱스 필수)
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales_summary;

-- 자동 갱신: cron 또는 pg_cron 확장 사용
-- SELECT cron.schedule('refresh-sales', '0 * * * *',
--   'REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales_summary');

-- Oracle: 자동 갱신 옵션
CREATE MATERIALIZED VIEW mv_daily_sales
REFRESH FAST ON COMMIT  -- 트랜잭션 커밋 시 자동 갱신
AS SELECT date, SUM(amount) FROM orders GROUP BY date;

🗣️ 실무 대화 예시

데이터 분석가: "대시보드 조회가 30초나 걸려요. 매번 천만 건 집계해서..."

DBA: "머티리얼라이즈드 뷰로 미리 집계해두면 밀리초 단위로 줄어요."

데이터 분석가: "실시간 데이터가 필요한데요?"

DBA: "매 시간 자동 갱신하면 1시간 지연은 감수해야 해요. 실시간이 정말 필요하면 인덱스 최적화나 캐시 레이어를 검토해봅시다."

면접관: "머티리얼라이즈드 뷰와 일반 뷰의 차이점과 사용 사례를 설명해주세요."

지원자: "일반 뷰는 쿼리 정의만 저장하고 조회 시 실행되지만, 머티리얼라이즈드 뷰는 결과를 물리적으로 저장합니다. 복잡한 집계나 조인이 자주 조회될 때 사용합니다. 단점은 저장 공간이 필요하고 데이터 신선도가 갱신 주기에 의존한다는 점입니다."

면접관: "갱신 전략은 어떻게 세우나요?"

지원자: "데이터 변경 빈도와 허용 지연시간에 따라 결정합니다. 야간 배치로 충분하면 COMPLETE, 빈번하면 FAST REFRESH나 트리거 기반 갱신을 검토합니다."

리뷰어: "이 머티리얼라이즈드 뷰가 매 분마다 COMPLETE REFRESH 되고 있네요?"

개발자: "네, 최신 데이터가 필요해서요."

리뷰어: "데이터가 1000만 건인데 매 분 전체 재계산이면 DB에 부담이 커요. CONCURRENTLY 옵션 쓰고, 갱신 주기를 5분으로 늘리거나, 변경 데이터만 반영하는 증분 방식 검토해보세요."

개발자: "CONCURRENTLY 옵션 추가하고 주기도 조정하겠습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기