본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

구체화된 뷰

~12 min · extensions, views

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

질의 결과를 디스크에 보관해

일반 VIEW는 저장된 질의라 읽을 때마다 실행하지만 MATERIALIZED VIEW는 결과까지 저장해. 복잡한 JOIN과 집계를 한 번 계산한 뒤 테이블처럼 빠르게 읽을 수 있어.

신선도와 계산 비용을 바꾼다

대시보드·순위표처럼 자주 읽고 초 단위 최신성이 필요 없는 결과에 맞아. 단순히 색인이 빠진 질의를 감추는 용도로 쓰지는 마.

운영 환경에서는 동시 갱신을

REFRESH MATERIALIZED VIEW는 다시 만드는 동안 읽기를 막을 수 있어. REFRESH MATERIALIZED VIEW CONCURRENTLY는 고유 색인을 요구하지만 읽기를 계속 허용해. 주기에 맞춰 작업 도구나 pg_cron으로 실행해.

Code

대시보드를 위한 구체화된 뷰·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

프로젝트에서 느린 집계 질의를 찾거나 가정해 구체화된 뷰와 고유 색인으로 감싸. 주기적으로 CONCURRENTLY 갱신하도록 일정을 만들고 질의 지연 시간을 전후로 비교해.

Progress

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

댓글 0

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

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