CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW
SELECT 쿼리의 결과를 물리적으로 저장해 두는 구체화 뷰(materialized view)를 만들 때 쓰는 명령어예요. 반복되는 무거운 계산을 한 번만 수행해 쿼리 성능을 크게 높일 수 있어요.
출처: 문서
본문
Synopsis
CREATE [ OR REPLACE ] MATERIALIZED VIEW
[ IF NOT EXISTS ] view_name
[ GRACE PERIOD interval ]
[ WHEN STALE ( INLINE | FAIL ) ]
[ COMMENT string ]
[ WITH properties ]
AS query
Description
SELECT 쿼리의 새 구체화 뷰 view_name의 정의를 만들고 검증해요. 생성 후에는 REFRESH MATERIALIZED VIEW 문장을 실행해 구체화 뷰에 데이터를 채워야 해요. 이 구체화 뷰는 새로고침 시점의 쿼리 결과를 물리적으로 담은 것이에요. 데이터가 저장되어 이후 쿼리에서 참조할 수 있어요.
구체화 뷰에 접근하는 쿼리는 보통 같은 쿼리로 만든 뷰(view)에서 데이터를 가져오는 것보다 빨라요. 데이터를 만드는 계산·집계·기타 연산은 뷰에 접근할 때마다가 아니라 구체화 뷰를 새로고침할 때 한 번만 수행되거든요. 시간이 지나면서 여러 번 읽거나 여러 사용자가 읽으면 반복 처리가 계속 일어나는데, 구체화 뷰에서는 이를 피할 수 있어요.
선택적 OR REPLACE 절은 구체화 뷰가 이미 존재할 때 오류를 내는 대신 기존 뷰를 교체해요.
선택적 IF NOT EXISTS 절은 구체화 뷰가 아직 존재하지 않을 때만 만들게 해요.
OR REPLACE와 IF NOT EXISTS는 상호 배타적인 절이에요.
선택적 GRACE PERIOD 절은 쿼리 결과물(materialization)을 쿼리 처리에 얼마나 오래 사용할지를 지정해요:
- 마지막 새로고침 이후 유예 기간(grace period) 안에서는 쿼리 결과물을 사용하므로 데이터 조회가 매우 빠르지만, 기본 테이블과 데이터가 최신이 아닐 수 있어요.
- 유예 기간이 지나면 구체화 뷰의 데이터는 쿼리를 사용해 즉석으로(on-the-fly) 계산돼요. 조회는 더 느리지만 기본 테이블과 데이터가 최신으로 유지돼요.
지정하지 않으면 유예 기간은 기본적으로 무한대가 되어 모든 쿼리가 유예 기간 안에 들어와요.
REFRESH MATERIALIZED VIEW 작업을 실행할 때마다 유예 기간의 시작 시각이 초기화돼요.
선택적 WHEN STALE 절은 구체화 뷰가 오래(stale, 유예 기간 밖)되었을 때의 동작을 지정해요:
INLINE- 구체화 뷰가 오래되면 논리적 뷰처럼 확장되어, 구체화 뷰에 접근하는 쿼리가 기본 쿼리 정의를 사용해 최신 데이터를 가져와요.WHEN STALE을 지정하지 않았을 때의 기본 동작이에요.FAIL- 구체화 뷰가 오래되면 접근하는 쿼리가 오류로 실패해요.
WHEN STALE 절은 커넥터 지원이 필요하다는 점에 주의하세요. 커넥터가 이 기능을 지원하지 않으면 INLINE 이외의 값으로 WHEN STALE을 사용하면 오류가 나요.
선택적 COMMENT 절은 문자열 주석을 구체화 뷰에 대한 메타데이터와 함께 저장해요. 주석은 SHOW CREATE MATERIALIZED VIEW 문장으로 표시되며 system.metadata.materialized_view_properties 테이블에서 확인할 수 있어요.
선택적 WITH 절은 구체화 뷰 생성 속성을 정의할 때 사용해요. 여러 속성/값 쌍은 쉼표로 구분해요. 커넥터는 이 속성을 구체화 뷰 새로고침 작업의 입력 파라미터로 사용해요. 지원되는 속성은 커넥터마다 다르며 특정 커넥터 문서의 SQL 지원 섹션에 자세히 설명되어 있어요.
생성에 성공하면 구체화 뷰에 대한 모든 메타데이터가 시스템 테이블에서 확인 가능해요.
Examples
orders 테이블 위에 취소된 주문만 포함하는 간단한 구체화 뷰 cancelled_orders를 만들려면:
CREATE MATERIALIZED VIEW cancelled_orders
AS
SELECT orderkey, totalprice
FROM orders
WHERE orderstatus = 3;
모든 고객의 모든 주문을 요약하는 구체화 뷰 order_totals_by_date를 만들거나 교체하려면:
CREATE OR REPLACE MATERIALIZED VIEW order_totals_by_date
AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
Iceberg 커넥터를 사용하는 카탈로그에 주석과 저장소의 두 필드 파티셔닝을 가진 구체화 뷰를 만들려면:
CREATE MATERIALIZED VIEW orders_nation_mkgsegment
COMMENT 'Orders with nation and market segment data'
WITH ( partitioning = ARRAY['mktsegment', 'nationkey'] )
AS
SELECT o.*, c.nationkey, c.mktsegment
FROM orders AS o
JOIN customer AS c
ON o.custkey = c.custkey;
여러 속성을 설정하려면:
WITH ( format = 'ORC', partitioning = ARRAY['_date'] )
유예 기간과 뷰가 오래되었을 때 실패하는 WHEN STALE 동작을 가진 구체화 뷰를 만들려면:
CREATE MATERIALIZED VIEW orders_summary
GRACE PERIOD INTERVAL '1' HOUR
WHEN STALE FAIL
AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
명시적으로 INLINE 동작(기본값)을 가진 구체화 뷰를 만들려면:
CREATE MATERIALIZED VIEW orders_summary
GRACE PERIOD INTERVAL '1' HOUR
WHEN STALE INLINE
AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
모든 카탈로그의 정의된 구체화 뷰 속성을 보려면:
SELECT * FROM system.metadata.materialized_view_properties;
모든 카탈로그의 구체화 뷰에 대한 메타데이터를 보려면:
SELECT * FROM system.metadata.materialized_views;
See also
DROP MATERIALIZED VIEW, SHOW CREATE MATERIALIZED VIEW, REFRESH MATERIALIZED VIEW 명령과 함께 사용해요.
더 알아보기 (Learn more)
구체화 뷰를 새로고침하는 REFRESH MATERIALIZED VIEW와 제거하는 DROP MATERIALIZED VIEW도 함께 확인해 보세요.