머티리얼라이즈드 뷰
Materialized View
결과가 저장된 뷰. 주기적 갱신, 빠른 조회.
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 옵션 추가하고 주기도 조정하겠습니다."