한양과학기술고등학교

에듀테크 프로젝트 대시보드

뷰와 구체화 뷰

VIEW MATERIALIZED VIEW REFRESH CONCURRENTLY updatable

복잡한 쿼리에 이름을 붙여 재사용합니다. 일반 뷰는 매번 실행, 구체화 뷰는 결과를 저장.

1. 일반 뷰

CREATE VIEW active_students AS
SELECT s.*, c.room
FROM students s JOIN classes c ON c.id = s.class_id
WHERE s.deleted_at IS NULL;

SELECT * FROM active_students WHERE grade = 1;   -- 실제로는 원본 조인 실행

단순한 단일 테이블 뷰는 수정 가능(INSERT/UPDATE 가능). 조인·집계가 있으면 읽기 전용이며, 필요 시 INSTEAD OF 트리거로 쓰기를 정의.

2. 구체화 뷰

CREATE MATERIALIZED VIEW class_stats AS
SELECT class_id, count(*) AS n, avg(score) AS avg_score
FROM exams GROUP BY class_id
WITH DATA;

REFRESH MATERIALIZED VIEW class_stats;   -- 갱신 (그동안 읽기 차단)

3. 무중단 갱신

-- CONCURRENTLY 는 UNIQUE 인덱스가 있어야 함
CREATE UNIQUE INDEX ON class_stats (class_id);
REFRESH MATERIALIZED VIEW CONCURRENTLY class_stats;   -- 읽기 안 막힘 (대신 느림)
언제 쓰나
  • 무겁고(수 초+) 자주 조회되며 약간 낡아도 되는 집계 — 대시보드, 리더보드
  • 갱신은 cron 이나 pg_cron 으로 주기 실행

4. 대안

실시간성이 필요하면 구체화 뷰 대신 요약 테이블 + 트리거 또는 애플리케이션 캐시(Redis)를 검토하세요.

"timestamptz 를 써라. 거의 항상."