구체화된 뷰
PostgreSQL의 구체화된 뷰(materialized view)란 무엇인가요?
구체화된 뷰는 쿼리 결과를 저장해 테이블처럼 읽을 수 있게 합니다. 읽기는 빠르지만, 데이터는 REFRESH MATERIALIZED VIEW를 실행할 때만 바뀝니다.
구체화된 뷰는 읽을 때마다 쿼리를 실행하는 일반 뷰와 달리, 정의 쿼리를 한 번 실행하고 그 결과를 저장합니다. 테이블을 읽는 것만큼 빠르게 읽을 수 있으며 자체 인덱스를 가질 수 있습니다.
저장된 데이터는 기반 테이블의 변경을 따라가지 않으며, REFRESH MATERIALIZED VIEW를 실행할 때만 바뀝니다. 일반 새로 고침은 실행되는 동안 뷰 읽기를 차단합니다. CONCURRENTLY를 사용하면 새로 고침 중에도 읽기를 계속할 수 있는데, 이 경우 뷰에 고유 인덱스가 하나 이상 있어야 하며 변경되는 행이 적을 때는 더 빠를 수 있습니다.
예제
이 예제는 구체화된 뷰에서 지역별 매출을 합산하고, 새 매출을 기록한 뒤, 고유 인덱스 덕분에 가능한 동시 새로 고침으로 뷰를 갱신합니다. north의 합계에는 새로 고침 후에야 새 매출이 반영됩니다.
CREATE TABLE sales (id int PRIMARY KEY, region text, amount numeric);
INSERT INTO sales
SELECT g, (ARRAY['north', 'south', 'east'])[1 + g % 3], g % 50
FROM generate_series(1, 30000) AS g;
CREATE MATERIALIZED VIEW sales_by_region AS
SELECT region, sum(amount) AS total FROM sales GROUP BY region;
CREATE UNIQUE INDEX ON sales_by_region (region);
INSERT INTO sales VALUES (30001, 'north', 1000);
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_by_region;
SELECT * FROM sales_by_region ORDER BY region;확장 없이 기본 PostgreSQL 16 또는 17에서 실행되는 일반 SQL입니다. 버려도 되는 빈 데이터베이스에서 실행하세요.
출처
PostgreSQL 공식 문서(영문)입니다.