Materialized View (MView) with Query Rewrite 살펴보기

Claire H. Do
Snowflake Korea
Published in
6 min readJul 30, 2023

Snowflake의 Dynamic Table 기능이 Public Preview 로 출시되면서 Materialized View 와의 차이점에 대한 질문들도 종종 생기고 있습니다.

이번 아티클에서 다룰 내용은 Materialized View 와 Dynamic Table 비교 테이블 내용 중 아래 문구를 이해하기 위한 테스트 입니다.

Snowflake: Dynamic Tables 와 Materialized Views 비교 일부
Snowflake: Dynamic Tables 와 Materialized Views 비교 일부

Materialized views are designed to improve query performance transparently.

투명적이게 쿼리 성능을 개선한다는 것이 정확이 어떤 의미일까요? 이해를 돕기 위해 실제 테스트 과정을 보며 알아보겠습니다.

Dynamic Table 기능에 대해 궁금하다면 Daniel 님의 What’s new: Dynamic Table 아티클을 참고해주세요!

Step 1. 테스트를 위한 준비

  1. 사용할 환경 준비
-- Result Cache 끄기
alter session set use_cached_result=false;

-- 사용할 Virtual Warehouse 선택
use warehouse TEST_WH; -- XSMALL 사이즈

-- 사용할 DB 선택
use database TEST_DB;

/*
My DB object structure:

⎿DEMO_DB
⎿TPCH_SF1000
⎿ORDERS
*/

💡 TIP:
테스트할만한 데이터셋이 없는 경우 Snowflake Sample Database 를 활용해보세요! https://docs.snowflake.com/ko/user-guide/sample-data-using

Step 2.MView 생성 전 ORDERS 테이블 조회 쿼리 실행

-- MView 생성 전 ORDERS 테이블 조회
select O_ORDERDATE, COUNT(O_ORDERKEY) ORDER_COUNT
from ORDERS
where O_ORDERDATE >= date '1995-01-01'
and O_ORDERPRIORITY = '1-URGENT'
group by 1
order by 1;
Snowflake Query Results: MView 생성 전 쿼리 실행 (12s 소요)
Snowflake Query Results: MView 생성 전 쿼리 실행 (12s 소요)
Snowflake Query Profile: MView 생성 전 쿼리 실행
Snowflake Query Profile: MView 생성 전 쿼리 실행

DEMO_DB.TPCH_SF100.ORDERS 테이블을 스캔 한 것을 확인 합니다.

Step 3. MView 생성

-- MView 생성
create materialized view MV_ORDERS_URGENT
as
select O_ORDERDATE, COUNT(O_ORDERKEY) ORDER_COUNT
from ORDERS
where O_ORDERDATE >= date '1995-01-01'
and O_ORDERPRIORITY = '1-URGENT'
group by 1;

Step 4. ORDERS 테이블 조회 쿼리를 다시 실행

-- MView 생성 후 ORDERS 테이블 다시 조회
-- NOTE: MView 가 아닌 베이스 테이블인 ORDERS 테이블을 그대로 조회
select O_ORDERDATE, COUNT(O_ORDERKEY) ORDER_COUNT
from ORDERS
where O_ORDERDATE >= date '1995-01-01'
and O_ORDERPRIORITY = '1-URGENT'
group by 1
order by 1;
Snowflake Query Results: MView 생성 후 쿼리 실행 (762ms 소요)
Snowflake Query Results: MView 생성 후 쿼리 실행 (762ms 소요)
Snowflake Query Profile: MView 생성 후 쿼리 실행
Snowflake Query Profile: MView 생성 후 쿼리 실행

Query Profile(쿼리 프로파일)을 살펴보면, MView 에 쿼리를 하지 않았는데도 MView 가 사용 되어 쿼리 속도가 12초 에서 0.762초 로 향상된 것을 확인 할 수 있습니다. 문서에서 보았던 “improve query performance transparently” 라는 문구가 정확히 이런 현상을 의미하는 것입니다.

자주 사용되는 쿼리 문장을 Materialized View 로 생성해놓았을 경우, 이 사실을 모르는 다른 사용자가 똑같은 쿼리 또는 비슷한 쿼리를 실행했을때 Snowflake 의 Query Optimizer 가 자동으로 MView 를 사용하도록 Query Rewrite 를 진행합니다.

Step 5. 쿼리 조건을 변경하여 ORDERS 테이블 조회

-- 쿼리 날짜 조건을 변경하여 쿼리 시도
select O_ORDERDATE, COUNT(O_ORDERKEY) ORDER_COUNT
from ORDERS
where O_ORDERDATE >= date '1998-01-01'
and O_ORDERPRIORITY = '1-URGENT'
group by 1;
Snowflake Query Results: 쿼리를 변경하여 다시 ORDERS 테이블 조회
Snowflake Query Results: 쿼리를 변경하여 다시 ORDERS 테이블 조회
Snowflake Query Results: EXPLAIN 으로 쿼리 플랜 확인
Snowflake Query Results: EXPLAIN 으로 쿼리 플랜 확인

쿼리 조건이 변경되었지만 Snowflake Query Optimizer는 해당 쿼리가 MView 를 조회하는 것이 성능적으로 이점이 있다고 판단하여 query rewrite를 진행합니다.

👋 여기까지 Snowflake’s Materialized View with Query Rewrite (쿼리 재작성) 에 대한 이야기 였습니다!

--

--