C.W.K.
Stream
Lesson 06 of 10 · published

Materialised View

~12 min · extensions, views

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

요청 시 캐시된 쿼리 결과

일반 VIEW 가 그냥 저장된 쿼리 — 모든 SELECT 가 기저 쿼리 재실행. MATERIALIZED VIEW 가 저장된 쿼리 + 결과 — 데이터 한 번 계산, 디스크 저장, 테이블처럼 쿼리. 갱신은 스케줄 (또는 요청 시) 로 신선 데이터.

Materialised view 가 본전 뽑는 때

  • 자주 쿼리되는 비싼 aggregation (대시보드, 리더보드).
  • 기저 테이블이 쿼리되는 것보다 훨씬 덜 변하는 복잡한 join.
  • 초 단위 신선도 불필요한 보고서 — 분 신선 또는 시간 신선이면 충분.

갱신

REFRESH MATERIALIZED VIEW 가 데이터 재구축; 실행 동안 view 잠김. REFRESH MATERIALIZED VIEW CONCURRENTLY 가 잠금 없이 재구축 — 그러나 view 에 unique 인덱스 필요 + 더 느림. 프로덕션엔 CONCURRENTLY.

Code

대시보드 위한 materialised view·sql
CREATE MATERIALIZED VIEW monthly_revenue AS
SELECT DATE_TRUNC('month', placed_at) AS month,
       region,
       SUM(total)                     AS revenue,
       COUNT(*)                       AS order_count
FROM   orders
WHERE  status = 'completed'
GROUP  BY 1, 2;

-- CONCURRENTLY 갱신 위해 필수
CREATE UNIQUE INDEX monthly_revenue_uniq ON monthly_revenue (month, region);

-- 쿼리는 plain 테이블 read — 즉시
SELECT * FROM monthly_revenue WHERE month >= now() - INTERVAL '12 months';
스케줄 갱신·sql
-- 프로덕션에서 view 잠그지 않고 갱신
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_revenue;

-- pg_cron (extension) 또는 앱 job runner 로 스케줄
-- pg_cron 예: 10 분마다
-- SELECT cron.schedule('refresh-monthly-revenue', '*/10 * * * *',
--                      'REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_revenue');

External links

Exercise

프로젝트의 느린 aggregation 쿼리 식별 (또는 발명). materialised view + unique 인덱스에 감쌈. 주기적 CONCURRENTLY 갱신 스케줄. 쿼리 latency 전후 비교.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.