다이나믹 테이블 지원 쿼리
다이나믹 테이블 지원 쿼리
각 리프레시 모드에서 어떤 SQL 구문, 함수, 데이터 타입이 지원되는지 알려드릴게요. 다이나믹 테이블을 만들기 전에 이 문서를 참고해 정의가 증분 리프레시(incremental refresh) 대상인지 예측해 보세요.
출처: Snowflake 문서
본문
최근 추가된 쿼리 지원:
- FROM 절의 VALUES 절 (2026년 9월)
- SELECT 절의 비결정적 집계 함수(non-deterministic aggregate functions) — APPROX_COUNT_DISTINCT, APPROX_PERCENTILE, APPROX_TOP_K (2026년 9월)
- VOLATILE 스칼라 UDF (2026년 7월)
- MIN_BY / MAX_BY 집계·윈도우 함수 (2026년 3월)
- 자기 조인을 포함한 확장된 outer join 패턴 (2026년 4월)
- 전체 리프레시 다이나믹 테이블 다운스트림의 기본 키 기반 증분 리프레시 (2026년 4월)
- 증분 리프레시용 UNION 집합 연산자 (2025년 8월)
- 증분 리프레시용 SELECT 절의 Cortex AI 함수 (2025년 9월)
- WHERE/HAVING/QUALIFY의 CURRENT_TIMESTAMP/DATE/TIME 필터링 (2025년 5월)
ADAPTIVE 리프레시와 쿼리 지원
ADAPTIVE는 증분 리프레시와 같은 쿼리 구문 요구사항을 가집니다. ADAPTIVE 동작에 대한 자세한 내용은 ADAPTIVE 리프레시를 참고하세요.
정의에 증분 리프레시가 지원하지 않는 구문이 포함되면 Snowflake는 대신 전체 리프레시(full refresh)를 선택하며, 이 경우 매 리프레시마다 모든 데이터를 재처리합니다. 비용 영향은 다이나믹 테이블 비용 이해하기를 참고하세요.
쿼리 패턴이 증분 리프레시 성능에 미치는 영향에 대한 지침은 증분 리프레시 쿼리 최적화를 참고하세요.
지원되는 데이터 타입
다이나믹 테이블은 증분·전체 리프레시 모두에서 모든 Snowflake SQL 데이터 타입을 지원합니다. 단, 다음은 예외입니다:
- 구조적 데이터 타입(구조적 OBJECT, 구조적 ARRAY, MAP). 이 제한은 증분·전체 리프레시 모두에 적용됩니다. 반구조적 타입(VARIANT, OBJECT, 스키마가 정의되지 않은 ARRAY)은 완전히 지원됩니다.
- 지리공간 데이터 타입(Geospatial data types) — 전체 리프레시에서만 지원.
증분·전체 리프레시 지원 매트릭스
다음 표는 각 리프레시 모드에서 지원되는 SQL 구문을 보여 줍니다. 증분 리프레시가 제한과 함께 지원되는 구문은 표에서 해당 조건을 설명합니다.
| 구문 | 증분 리프레시 | 전체 리프레시 |
|---|---|---|
| WITH | CTE 서브쿼리가 증분 지원 기능만 사용할 때 지원됩니다. WITH RECURSIVE는 지원되지 않습니다. | 지원 |
| CONNECT BY | 지원 안 함 | 지원 |
| SELECT | 지원. 표현식은 결정적(deterministic) 내장 함수와 불변(immutable) 사용자 정의 함수를 사용해야 합니다. 단, 이 페이지에서 SELECT 절에 지원된다고 나열한 함수는 예외입니다. 여기에는 APPROX_COUNT_DISTINCT, APPROX_PERCENTILE, APPROX_TOP_K 같은 비결정적 집계 함수와 스칼라 VOLATILE 사용자 정의 함수가 포함됩니다. | 지원 |
| DISTINCT | 지원 | 지원 |
| FROM | 기본 테이블, 뷰, Snowflake 관리 Apache Iceberg™ 테이블, 외부 관리 Iceberg 테이블, Delta Direct 테이블, 다른 다이나믹 테이블, VALUES 절. FROM 절 밖의 서브쿼리(예: WHERE EXISTS)는 지원되지 않습니다. | 지원 |
| VALUES | FROM 절에서 지원. 표현식은 상수이거나 컴파일 시점에 상수로 평가될 수 있는 표현식이어야 합니다. VALUES 예를 참고하세요. | 지원 |
| WHERE / HAVING / QUALIFY | SELECT에서 유효한 것과 같은 표현식의 필터가 지원됩니다. 단, 이 페이지에서 SELECT 절에서만 지원된다고 나열한 함수(예: APPROX_COUNT_DISTINCT, APPROX_PERCENTILE, APPROX_TOP_K, VOLATILE 스칼라 UDF)는 예외입니다. CURRENT_TIMESTAMP, CURRENT_TIME, CURRENT_DATE 함수와 그 별칭을 사용한 필터가 지원됩니다. | 지원. CURRENT_TIMESTAMP, CURRENT_TIME, CURRENT_DATE 함수와 그 별칭을 사용한 필터가 지원됩니다. |
| GROUP BY | 지원. GROUP BY ROLLUP, GROUP BY CUBE, GROUP BY GROUPING SETS는 증분 리프레시에서 지원되지 않습니다. | 지원 |
| 스칼라 집계 | 지원 | 지원 |
| INNER JOIN | 지원. 테이블 수를 제한 없이 지정할 수 있고 Snowflake가 조인의 모든 테이블 변경을 추적합니다. | 지원 |
| CROSS JOIN | 지원. 테이블 수를 제한 없이 지정할 수 있고 Snowflake가 조인의 모든 테이블 변경을 추적합니다. | 지원 |
| [LEFT | RIGHT | FULL] OUTER JOIN | 동등 조건(equality predicate)이 있는 경우에만 지원. 비동등 조건의 outer join(예: ON a.id > b.id)은 증분 리프레시에서 지원되지 않습니다. 자기 조인(outer join 양쪽이 같은 테이블을 참조)은 지원됩니다. 테이블 수를 제한 없이 지정할 수 있고 Snowflake가 조인의 모든 테이블 변경을 추적합니다. LEFT JOIN 예를 참고하세요. | 지원 |
| LATERAL JOIN | 지원 안 함. 단, FLATTEN()과 함께 LATERAL은 사용할 수 있습니다. AUTO를 사용하면 Snowflake는 보통 lateral flatten 조인이 있는 정의를 증분 리프레시로 해석합니다(다른 미지원 구문이 없다면). lateral flatten 조인에서 flatten의 SEQ 컬럼을 선택하는 것은 증분 리프레시에서 지원되지 않습니다. | 지원 |
| UNION ALL | 지원. UNION ALL 예를 참고하세요. | 지원 |
| UNION (ALL 없이) | 지원. UNION ALL에 SELECT DISTINCT를 결합한 것처럼 동작합니다. | 지원 |
| MINUS, EXCEPT, INTERSECT | 지원 안 함 | 지원 |
| ORDER BY | 허용되지만 효과는 없습니다. 다이나믹 테이블은 보장된 행 순서가 없습니다. | 허용되지만 효과는 없습니다. 다이나믹 테이블은 보장된 행 순서가 없습니다. |
| LIMIT / FETCH / TOP <n> | 지원 안 함 | 지원 |
| 윈도우 함수 | 다음을 제외하고 지원: 슬라이딩 윈도우 프레임이 있는 PERCENT_RANK, DENSE_RANK, RANK(예: ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING). ANY_VALUE는 비결정적 함수라 지원되지 않습니다. APPROX_COUNT_DISTINCT, APPROX_PERCENTILE, APPROX_TOP_K 같은 비결정적 집계 함수는 SELECT 절에서 지원됩니다. 비결정적 집계 함수를 참고하세요. | 지원 |
| 사용자 정의 함수 (UDF와 UDTF) | 제한과 함께 지원. 아래 사용자 정의 함수를 참고하세요. | 지원 |
| ML 또는 LLM 함수 | SELECT 절에서 지원. | 지원 |
| 모든 서브쿼리 연산자 | 지원 안 함 | 지원 |
| 외부 함수(External functions) | 지원 안 함 | 지원 안 함 |
| PIVOT | IN 절에서 고정 값 목록을 쓸 때 지원. IN 절에서 서브쿼리를 쓸 때는 지원 안 함. | 지원 |
| UNPIVOT | 지원 안 함 | 지원 |
| SAMPLE / TABLESAMPLE | 지원 안 함 | 지원 안 함 |
| 시퀀스(Sequences) | 지원 안 함 | 지원 |
일반적인 구문 예제
다음 예제는 증분 리프레시 대상이 되는 일반적인 SQL 패턴을 보여 줍니다.
예: 증분 리프레시를 사용한 LEFT JOIN
다음 예제는 주문 데이터를 고객 데이터와 LEFT JOIN하는 다이나믹 테이블을 만듭니다. LEFT JOIN이 동등 조건을 사용하므로 이 정의는 증분 리프레시 대상입니다.
CREATE OR REPLACE DYNAMIC TABLE dt_orders_with_customers
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
REFRESH_MODE = INCREMENTAL
AS
SELECT o.order_id, o.order_date, o.product_name, o.quantity * o.unit_price AS line_total,
c.customer_name, c.region
FROM raw_orders o
LEFT JOIN dim_customers c
ON o.customer_id = c.customer_id;
매칭되는 고객이 없는 주문은 <C>customer_name</C>과 <C>region</C>이 NULL인 결과로 나타납니다. Snowflake는 <C>raw_orders</C>와 <C>dim_customers</C> 양쪽의 변경을 추적합니다.
예: 증분 리프레시를 사용한 VALUES 절
다음 예제는 주문 데이터를 VALUES 절로 정의한 상수 조회 테이블과 조인합니다. Snowflake는 <C>raw_orders</C>의 변경을 추적합니다. VALUES 행은 상수라서 리프레시 사이에 변하지 않아요.
CREATE OR ALTER DYNAMIC TABLE dt_orders_by_status_group
TARGET_LAG = '30 minutes'
WAREHOUSE = transform_wh
REFRESH_MODE = INCREMENTAL
AS
SELECT o.order_id, o.customer_id, o.order_date, o.order_status, s.status_group
FROM raw_orders o
INNER JOIN (VALUES ('completed', 'closed'),
('returned', 'closed'),
('pending', 'open'))
AS s(order_status, status_group)
ON o.order_status = s.order_status;
예: 증분 리프레시를 사용한 UNION ALL
다음 예제는 두 기본 테이블의 행을 UNION ALL로 결합합니다. 두 분기 모두 호환 가능한 컬럼 목록을 만들어야 합니다.
-- 기본 테이블 (간소화된 설정)
CREATE OR REPLACE TABLE raw_orders_us (
order_id INT, customer_id INT, order_date TIMESTAMP_NTZ,
product_name VARCHAR, quantity INT, unit_price DECIMAL(10,2),
region VARCHAR DEFAULT 'US'
);
CREATE OR REPLACE TABLE raw_orders_eu (
order_id INT, customer_id INT, order_date TIMESTAMP_NTZ,
product_name VARCHAR, quantity INT, unit_price DECIMAL(10,2),
region VARCHAR DEFAULT 'EU'
);
CREATE OR REPLACE DYNAMIC TABLE dt_combined_orders
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
REFRESH_MODE = INCREMENTAL
AS
SELECT order_id, customer_id, order_date, product_name, quantity, unit_price, region
FROM raw_orders_us
UNION ALL
SELECT order_id, customer_id, order_date, product_name, quantity, unit_price, region
FROM raw_orders_eu;
Snowflake는 <C>raw_orders_us</C>와 <C>raw_orders_eu</C>의 변경을 독립적으로 추적합니다. 어느 테이블에든 삽입된 새 행은 증분으로 처리됩니다.
예: 증분 리프레시를 사용한 LATERAL FLATTEN
다음 예제는 LATERAL FLATTEN을 사용해 반구조적 VARIANT 컬럼을 펼치는데, 이는 증분 리프레시에서 지원됩니다.
먼저 중첩 JSON 데이터가 있는 기본 테이블을 만드세요:
CREATE OR REPLACE TABLE persons AS
SELECT column1 AS id, parse_json(column2) AS entity
FROM values
(12712555, '{ name: { first: "John", last: "Smith"},
contact: [
{ business:[
{ type: "phone", content:"555-1234" },
{ type: "email", content:"[email protected]" } ] } ] }'),
(98127771, '{ name: { first: "Jane", last: "Doe"},
contact: [
{ business:[
{ type: "phone", content:"555-1236" },
{ type: "email", content:"[email protected]" } ] } ] }');
CREATE OR REPLACE DYNAMIC TABLE dt_flattened_contacts
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
AS
SELECT p.id, f.value, f.path
FROM persons p, LATERAL FLATTEN(input => p.entity) f;
지원되는 비결정적 함수
증분 리프레시에서 많은 비결정적 함수가 지원됩니다. 타임스탬프 함수(CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME)는 WHERE, HAVING, QUALIFY 절에서 동작합니다. APPROX_COUNT_DISTINCT, APPROX_PERCENTILE, APPROX_TOP_K 같은 비결정적 집계 함수는 SELECT 절에서 지원됩니다. 세션 컨텍스트 함수(CURRENT_USER, CURRENT_ROLE, CURRENT_WAREHOUSE)와 시퀀스 함수는 제한됩니다. 다음 표가 전체 매트릭스입니다.
팁
<C>METADATA$ROW_LAST_COMMIT_TIME</C>는 각 행의 커밋 시간을 제공하며 증분 리프레시와 호환됩니다. 전체 리프레시 모드를 강제하지 않고 리프레시 타임스탬프가 필요할 때 SELECT 목록의<C>CURRENT_TIMESTAMP()</C>대신 이 값을 사용하세요. 행 타임스탬프로 파이프라인 지연 측정을 참고하세요.
| 비결정적 함수 | 증분 리프레시 | 전체 리프레시 |
|---|---|---|
| ANY_VALUE | 지원 안 함 | 지원 안 함 |
| APPROX_COUNT_DISTINCT | SELECT 절에서 지원 | 지원 |
| APPROX_PERCENTILE | SELECT 절에서 지원 | 지원 |
| APPROX_TOP_K | SELECT 절에서 지원 | 지원 |
| AI_CLASSIFY | SELECT 절에서 지원 | 지원 |
| AI_COMPLETE | SELECT 절에서 지원 | 지원 |
| CURRENT_ACCOUNT | 지원 안 함 | 지원 |
| CURRENT_DATE (및 별칭) | WHERE/HAVING/QUALIFY 절의 일부로만 지원. | WHERE/HAVING/QUALIFY 절의 일부로만 지원. |
| CURRENT_REGION | 지원 안 함 | 지원 |
| CURRENT_ROLE | 지원 안 함 | 지원 |
| CURRENT_TIME (및 별칭) | WHERE/HAVING/QUALIFY 절의 일부로만 지원. | WHERE/HAVING/QUALIFY 절의 일부로만 지원. |
| CURRENT_TIMESTAMP (및 별칭) | WHERE/HAVING/QUALIFY 절의 일부로만 지원. | WHERE/HAVING/QUALIFY 절의 일부로만 지원. |
| CURRENT_USER에 의존하는 함수 | 지원 안 함. 다이나믹 테이블 리프레시는 특수 SYSTEM 사용자와 함께 소유자 역할로 동작합니다. | 지원 안 함. 다이나믹 테이블 리프레시는 특수 SYSTEM 사용자와 함께 소유자 역할로 동작합니다. |
| CURRENT_WAREHOUSE | 지원 안 함 | 지원 |
| DENSE_RANK | 지원 | 지원 |
| AI_EMBED | SELECT 절에서 지원 | 지원 |
| AI_EXTRACT | SELECT 절에서 지원 | 지원 |
| FINETUNE (SNOWFLAKE.CORTEX) | SELECT 절에서 지원 | 지원 |
| FIRST_VALUE | 지원 | 지원 |
| LAST_VALUE | 지원 | 지원 |
| MAX_BY | 지원 | 지원 |
| MIN_BY | 지원 | 지원 |
| NTH_VALUE | 지원 | 지원 |
| RANK | 지원 | 지원 |
| ROW_NUMBER | 지원 | 지원 |
| SENTIMENT (SNOWFLAKE.CORTEX) | SELECT 절에서 지원 | 지원 |
| 시퀀스 함수 (예: SEQ1, SEQ2) | 지원 안 함 | 지원 |
| AI_TRANSLATE | SELECT 절에서 지원 | 지원 |
| VOLATILE 사용자 정의 함수 | SELECT 절에서 지원 | 지원 |
비결정적 집계 함수
비결정적 집계 함수는 SELECT 절에 나타날 때 INCREMENTAL, AUTO, ADAPTIVE 리프레시 모드의 증분 리프레시에서 지원됩니다. GROUP BY와 함께 집계로, 또는 윈도우 함수로 사용할 수 있어요.
지원되는 함수:
이 함수들은 근사값을 반환하지 정확한 결과는 아니에요. 예를 들어 APPROX_COUNT_DISTINCT는 <C>COUNT(DISTINCT ...)</C>의 근사값을 반환하지 정확한 distinct count는 아닙니다.
비결정적 집계는 SELECT 절에만 두세요 비결정적 집계 함수는 SELECT 절에서만 증분 리프레시가 지원됩니다. WHERE, GROUP BY, HAVING, QUALIFY 절에 배치하는 것은 지원되지 않습니다.
다음 예제는 주문을 고객별로 그룹화하고 APPROX_COUNT_DISTINCT로 각 고객이 주문한 distinct 제품 수를 추정합니다:
CREATE OR ALTER DYNAMIC TABLE dt_orders_by_customer
TARGET_LAG = '30 minutes'
WAREHOUSE = transform_wh
REFRESH_MODE = INCREMENTAL
AS
SELECT customer_id, APPROX_COUNT_DISTINCT(product_name) AS approx_distinct_products,
SUM(quantity * unit_price) AS order_total
FROM raw_orders
GROUP BY customer_id;
사용자 정의 함수
UDF는 다이나믹 테이블 정의에서 지원됩니다. UDF가 증분 리프레시를 지원하는지는 함수 유형과 volatility에 따라 달라집니다.
스칼라 UDF:
- IMMUTABLE: 증분 리프레시와 호환
- VOLATILE: SELECT 절에서만 사용하면 증분 리프레시와 호환
VOLATILE UDF는 SELECT 절에만 두세요 VOLATILE 스칼라 UDF는 SELECT 절에서만 증분 리프레시가 지원됩니다. WHERE, GROUP BY, HAVING, QUALIFY 절에 배치하는 것은 지원되지 않습니다.
테이블 함수(UDTF):
- lateral join에서만 지원
- UDTF는 volatility와 무관하게 항상 전체 리프레시를 강제합니다
기존 다이나믹 테이블이 사용하는 IMMUTABLE UDF를 교체하면 이후의 증분 리프레시가 실패합니다. UDF를 교체한 뒤 다이나믹 테이블을 다시 만드세요. 자세한 내용은 사용자 정의 함수 개요를 참고하세요.
지원되는 Snowflake Cortex AI 함수
증분 리프레시 모드의 다이나믹 테이블 SELECT 절에서 Snowflake Cortex AI 함수(LLM 함수 포함)를 사용할 수 있어요. Cortex AI 함수에 설명된 것과 같은 가용성 제한이 적용됩니다.
Cortex AI 함수는 리프레시될 때 데이터를 자동으로 분석하면서 AI 기반 인사이트를 다이나믹 테이블에 직접 추가하게 해줘요. 예를 들어 고객 리뷰, 지원 티켓, 설문 응답을 분류할 수 있습니다.
Cortex AI 함수는 SELECT 절에만 두세요 Cortex AI 함수는 SELECT 절에서만 증분 리프레시가 지원됩니다. WHERE, GROUP BY, HAVING, QUALIFY 절에 배치하는 것은 지원되지 않습니다.
다음 예제에서 <C>dt_review_sentiment</C>는 AI_FILTER를 사용해 각 리뷰를 LLM으로 평가합니다. 출력 컬럼 <C>enjoyed</C>는 프롬프트에 기반해 리뷰어가 식당을 즐겼는지 여부를 나타냅니다.
CREATE OR REPLACE TABLE reviews AS
SELECT 'Wow... Loved this place.' AS review
UNION ALL
SELECT 'The pizza is not good.' AS review;
CREATE OR REPLACE DYNAMIC TABLE dt_review_sentiment
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
REFRESH_MODE = INCREMENTAL
AS
SELECT review, AI_FILTER(CONCAT('The reviewer enjoyed the restaurant', review), {'model': 'llama3.1-70b'}) AS enjoyed
FROM reviews;
전체 리프레시로 폴백되는 원인
다음 조건이 있으면 Snowflake는 증분 리프레시 대신 전체 리프레시를 사용합니다. <C>REFRESH_MODE = INCREMENTAL</C>에서는 조건 중 하나라도 적용되면 생성이 실패합니다. <C>REFRESH_MODE = AUTO</C>에서는 생성은 성공하지만 생성 시점에 FULL로 해석됩니다. AUTO가 증분·전체 리프레시를 선택하는 방식에 대한 자세한 내용은 다이나믹 테이블 리프레시 모드를 참고하세요.
| 조건 | 범주 |
|---|---|
| 정의에 EXCEPT, INTERSECT, MINUS 포함 | 정의 형태 |
| 정의에 LIMIT / TOP 포함 | 정의 형태 |
| GROUP BY ROLLUP, GROUP BY CUBE, GROUP BY GROUPING SETS | 정의 형태 |
| 비동등 조건의 outer join(예: ON a.id > b.id) | 정의 형태 |
| WITH RECURSIVE | 정의 형태 |
| FROM 절 밖의 서브쿼리(예: WHERE EXISTS, WHERE IN (SELECT …)) | 정의 형태 |
| SELECT의 비결정적 스칼라 함수(예: RANDOM(), UUID_STRING(), CURRENT_TIMESTAMP()) | 함수 유형 |
| 서브쿼리가 포함된 SQL UDF | 함수 유형 |
| 외부 함수(External functions) | 함수 유형 |
| 상위 다이나믹 테이블이 FULL 리프레시 사용(시스템 파생 고유 키가 없을 때) | 파이프라인 형태 |
| 기본 테이블에서 change tracking이 활성화되지 않음 | 구성 |
다이나믹 테이블이 전체 리프레시로 해석된 이유를 식별하려면 <C>refresh_mode_reason</C> 컬럼을 조회하세요:
SHOW DYNAMIC TABLES LIKE 'dt_orders';
+-------------------+-------------------------------------------+
| refresh_mode | refresh_mode_reason |
|-------------------+-------------------------------------------|
| FULL | QUERY_NOT_SUPPORTED_FOR_INCREMENTAL |
+-------------------+-------------------------------------------+
일반적인 <C>refresh_mode_reason</C> 값:
| 값 | 의미 |
|---|---|
| QUERY_NOT_SUPPORTED_FOR_INCREMENTAL | 정의에 증분 리프레시에서 지원되지 않는 구문이 포함되어 있습니다. |
| USER_SPECIFIED_FULL_REFRESH | 다이나믹 테이블이 REFRESH_MODE = FULL로 생성되었습니다. |
| UPSTREAM_USES_FULL_REFRESH | 상위 다이나믹 테이블이 전체 리프레시를 사용하고 시스템 파생 고유 키가 없습니다. |
| NULL | 증분 리프레시가 지원됩니다. 폴백 이유가 없습니다. |
추가 값이 향후 릴리스에서 나타날 수 있습니다.
팁 쿼리가 전체 리프레시를 강제하는 구문을 사용하고 증분 처리가 필요하다면 커스텀 증분화(custom incrementalization)를 고려하세요. 커스텀 증분 다이나믹 테이블은 표준 쿼리 분석을 우회하고 리프레시 로직을 MERGE 또는 INSERT DML로 직접 정의하게 해줍니다.
INCREMENTAL에서 지원되지 않는 구문을 사용하면 어떻게 되나요
명시적으로 <C>REFRESH_MODE = INCREMENTAL</C>을 설정하고 정의에 증분 리프레시에서 지원되지 않는 구문이 포함되면 CREATE DYNAMIC TABLE 문이 오류와 함께 실패합니다:
CREATE OR REPLACE DYNAMIC TABLE dt_unsupported_example
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
REFRESH_MODE = INCREMENTAL
AS
SELECT order_id, order_date
FROM raw_orders
EXCEPT
SELECT order_id, order_date
FROM excluded_orders;
002711 (0A000): SQL compilation error:
Dynamic Table 'DT_UNSUPPORTED_EXAMPLE' is defined with REFRESH_MODE = INCREMENTAL,
but the query is not supported for incremental refresh.
대신 <C>REFRESH_MODE = AUTO</C>를 사용하면 같은 정의가 성공하지만 FULL로 해석됩니다.
증분 리프레시 제약사항
다음 제약사항은 증분 리프레시를 사용하는 다이나믹 테이블에 구체적으로 적용됩니다.
상위 전체 리프레시 다이나믹 테이블의 증분 리프레시
증분 리프레시 모드의 다이나믹 테이블은 전체 리프레시를 사용하는 상위 다이나믹 테이블을 소비할 수 없습니다. 단, 상위 전체 리프레시 다이나믹 테이블에 시스템 파생 고유 키가 있거나 frozen region(변하지 않을 행의 스냅샷)이 있으면 가능합니다. 두 조건 중 하나가 충족되면 Snowflake가 전체 리프레시에 걸쳐 행 수준 변경을 계산해 다운스트림 증분 처리를 가능하게 합니다.
이 기능을 쓰려면 다운스트림 다이나믹 테이블에 <C>REFRESH_MODE = INCREMENTAL</C>을 명시적으로 설정하세요. AUTO는 이 시나리오에서 증분으로 해석되지 않아요. 자세한 내용은 다이나믹 테이블 입력 데이터 최적화를 참고하세요.
마스킹 및 행 액세스 정책
다이나믹 테이블의 마스킹·행 액세스 정책은 리프레시 모드에 영향을 주지 않습니다. 기본 객체에 적용된 정책은 다음과 같이 증분 리프레시에 영향을 줍니다:
- 증분 다이나믹 테이블은 기본 테이블의 대부분의 액세스·행 마스킹 정책을 지원합니다.
- 비결정적 정책(예: 서브쿼리가 있는 정책)이나 테이블에서 데이터를 조회하는 정책은 다이나믹 테이블 리프레시 역할에 액세스가 명시적으로 허용된 경우에만 지원됩니다. 이전에는 CURRENT_ROLE과 IS_ROLE_IN_SESSION만 증분으로 지원되었습니다.
- 기본 객체의 정책 변경은 재초기화를 트리거할 수 있습니다. 자세한 내용은 다이나믹 테이블 수정을 참고하세요.
<C>CURRENT_AVAILABLE_ROLES()</C>는 리프레시가 명명된 사용자의 역할 컨텍스트 없이 실행되므로 리프레시 중에 기본적으로 빈 문자열 세트를 반환합니다. 마스킹·행 액세스 정책이 이 함수를 참조하면 다이나믹 테이블에<C>EXECUTE AS USER</C>를 설정해서 리프레시 중에 이 함수가 올바른 역할을 평가하게 하세요. 설정 단계는 특정 사용자 권한으로 리프레시 (EXECUTE AS USER)를 참고하세요.
복제(Replication)
증분 리프레시가 있는 복제된 다이나믹 테이블은 증분 리프레시를 재개하기 전에 페일오버 후 재초기화됩니다. 자세한 내용은 복제와 다이나믹 테이블을 참고하세요.
클로닝(Cloning)
클론된 증분 다이나믹 테이블은 생성 후 초기 리프레시 중에 재초기화가 필요할 수 있습니다. 기본 테이블이 삭제된 다른 다이나믹 테이블에서 클론한 경우, 클론은 일시 중단되며 재개하거나 리프레시할 수 없습니다.
다음 단계
- 증분 리프레시 성능을 위한 쿼리 패턴 최적화는 증분 리프레시 쿼리 최적화를 참고하세요.
- 리프레시 로직을 MERGE 또는 INSERT 문으로 직접 정의하려면 커스텀 증분화(custom incrementalization)를 참고하세요.
- 증분·전체 리프레시의 비용 차이는 다이나믹 테이블 비용 이해하기를 참고하세요.
- 리프레시 문제 해결은 다이나믹 테이블 리프레시 문제 해결을 참고하세요.
- 전체 CREATE DYNAMIC TABLE 구문은 CREATE DYNAMIC TABLE을 참고하세요.