CREATE DYNAMIC TABLE
CREATE DYNAMIC TABLE
지정된 쿼리를 기반으로 동적 테이블(dynamic table)을 만드는 명령이에요. 동적 테이블은 쿼리 결과를 자동으로 새로 고쳐 유지하는 테이블이에요.
출처: 문서
본문
이 명령은 다음 변형(variant)을 지원해요:
- CREATE OR ALTER DYNAMIC TABLE: 동적 테이블이 없으면 만들고, 있으면 수정합니다.
- CREATE DYNAMIC TABLE FROM BACKUP SET: 백업에서 동적 테이블을 복원합니다.
- CREATE DYNAMIC TABLE … CLONE: 기존 동적 테이블의 복제본을 만듭니다.
- CREATE DYNAMIC ICEBERG TABLE: 동적 Apache Iceberg™ 테이블을 만듭니다.
구문 (Syntax)
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE [ IF NOT EXISTS ] <name> (
-- Column definition
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ [ WITH ] PROJECTION POLICY <policy_name> ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ COMMENT '<string_literal>' ]
[ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
[ SCHEDULER = DISABLE | ENABLE ]
WAREHOUSE = <warehouse_name>
[ INITIALIZATION_WAREHOUSE = <warehouse_name> ]
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL | ADAPTIVE | CUSTOM_INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ COPY GRANTS ]
[ COPY TAGS ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ REQUIRE USER ]
[ FROZEN WHERE ( <expr> ) ]
[ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ BACKFILL FROM <table_name> ]
[ START AT ({ STREAM => '<stream_name>' | TIMESTAMP => <timestamp> | STATEMENT => <query_id> | OFFSET => -<seconds> }) ] -- Requires CUSTOM_INCREMENTAL + BACKFILL FROM
[ EXECUTE AS USER <user_name>
[ USE SECONDARY ROLES { ALL | NONE | <role> [ , ... ] } ]
]
[ ROW_TIMESTAMP = { TRUE | FALSE } ]
{ AS <query> | REFRESH USING ( <dml_statement> ) }
CREATE OR ALTER DYNAMIC TABLE 구문
CREATE OR ALTER [ TRANSIENT ] DYNAMIC TABLE <name> (
-- Column definition
<col_name> <col_type>
[ COLLATE '<collation_specification>' ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
[ SCHEDULER = DISABLE | ENABLE ]
WAREHOUSE = <warehouse_name>
[ INITIALIZATION_WAREHOUSE = <warehouse_name> ]
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL | ADAPTIVE | CUSTOM_INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ REQUIRE USER ]
[ FROZEN WHERE ( <expr> ) ]
[ BACKFILL FROM <table_name> ]
[ START AT ({ STREAM => '<stream_name>' | TIMESTAMP => <timestamp> | STATEMENT => <query_id> | OFFSET => -<seconds> }) ] -- Requires CUSTOM_INCREMENTAL + BACKFILL FROM
[ EXECUTE AS USER <user_name>
[ USE SECONDARY ROLES { ALL | NONE | <role> [ , ... ] } ]
]
[ ROW_TIMESTAMP = { TRUE | FALSE } ]
{ AS <query> | REFRESH USING ( <dml_statement> ) }
CREATE OR ALTER DYNAMIC TABLE 문의 정의는 완전한 목표 상태를 나타내요. 지정되지 않은 속성은 기본값으로 설정되지만, CHANGE_TRACKING과 ROW_TIMESTAMP는 생략하면 보존돼요.
다음 속성/매개변수에 대한 변경은 재초기화(reinitialization)를 트리거해요:
REFRESH_MODE- 쿼리 변경
- 기존 컬럼 이름 변경을 초래하는 컬럼 목록 변경
- 기존
FROZEN WHERE제거 또는 동결 영역(frozen region) 축소
CREATE DYNAMIC TABLE FROM BACKUP SET 구문
CREATE DYNAMIC TABLE <name> FROM BACKUP SET <backup_set> IDENTIFIER '<backup_id>'
백업 세트는 원본 테이블의 내부 테이블 ID와 연결돼요. 백업에서 동적 테이블을 복원하면 Snowflake가 초기 새로 고침 중에 새 테이블을 자동으로 초기화해요.
CREATE DYNAMIC TABLE … CLONE 구문
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE <name>
CLONE <source_dynamic_table>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
[
COPY GRANTS
COPY TAGS
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
EXECUTE AS USER <user_name>
USE SECONDARY ROLES { ALL | NONE | <role> [ , ... ] }
]
복제된 동적 테이블은 기본적으로 일시 중단(suspended)돼요. 소스 동적 테이블에 클러스터링 키가 있으면 복제본에도 있어요. 기본적으로 새 테이블의 Automatic Clustering은 일시 중단돼요.
CREATE DYNAMIC ICEBERG TABLE 구문
CREATE [ OR REPLACE ] DYNAMIC ICEBERG TABLE <name> (
-- Column definition
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
[ EXTERNAL_VOLUME = '<external_volume_name>' ]
[ CATALOG = 'SNOWFLAKE' ]
[ BASE_LOCATION = '<optional_directory_for_table_files>' ]
[ TARGET_FILE_SIZE = '{ AUTO | 16MB | 32MB | 64MB | 128MB }' ]
[ PARTITION BY ( partitionExpression [, partitionExpression , ...] ) ]
[ PATH_LAYOUT = { FLAT | HIERARCHICAL } ]
[ ICEBERG_VERSION = <integer> ]
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL | ADAPTIVE | CUSTOM_INCREMENTAL } ]
[ FROZEN WHERE ( <expr> ) ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ COPY GRANTS ]
[ COPY TAGS ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ REQUIRE USER ]
[ EXECUTE AS USER <user_name>
[ USE SECONDARY ROLES { ALL | NONE | <role> [ , ... ] } ]
]
{ AS <query> | REFRESH USING ( <dml_statement> ) }
여기서:
partitionExpression ::=
<col_name> -- identity transform
| BUCKET ( <num_buckets> , <col_name> )
| TRUNCATE ( <width> , <col_name> )
| YEAR ( <col_name> )
| MONTH ( <col_name> )
| DAY ( <col_name> )
| HOUR ( <col_name> )
동적 Iceberg 테이블을 새 동적 Iceberg 테이블로 복제하려면 CREATE DYNAMIC ICEBERG TABLE … CLONE을 사용해요. 복제본은 소스와 같은 외부 볼륨과 카탈로그를 사용하므로 EXTERNAL_VOLUME, CATALOG, BASE_LOCATION을 지정할 수 없어요.
필수 매개변수
<name>: 동적 테이블의 식별자예요. 생성되는 스키마 내에서 고유해야 해요.TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }: 동적 테이블의 지연(lag)을 지정해요.'num seconds | minutes | hours | days': 동적 테이블 내용이 기본 테이블 변경보다 얼마나 늦어도 되는지 최대 시간을 지정해요. 최소 60초여야 해요. 동적 테이블이 다른 동적 테이블에 의존하면 최소 대상 지연은 의존하는 동적 테이블의 대상 지연보다 크거나 같아야 해요.DOWNSTREAM: 동적 테이블에 의존하는 동적 테이블이 새로 고쳐질 때만 이 동적 테이블을 새로 고치도록 지정해요.SCHEDULER = ENABLE일 때 필요해요.
WAREHOUSE = warehouse_name: 동적 테이블을 새로 고치는 컴퓨팅 리소스를 제공하는 웨어하우스 이름을 지정해요. 이 웨어하우스에 USAGE 권한이 있는 역할을 사용해야 해요.{ AS query | REFRESH USING ( dml_statement ) }: 동적 테이블 내용을 지정해요. 정확히 하나를 지정해요.AS <query>: SELECT 기반 동적 테이블용. 동적 테이블이 포함해야 하는 쿼리 결과를 지정해요.REFRESH USING ( <dml_statement> ): 사용자 지정 증분(custom incremental) 동적 테이블용. 각 새로 고침에서 Snowflake가 실행하는MERGE INTO SELF또는INSERT INTO SELF문을 지정해요.
선택 매개변수
SCHEDULER = { DISABLE | ENABLE }: 동적 테이블을 Snowflake가 자동으로 새로 고치는지 지정해요.DISABLE은 자동 배경 새로 고침에서 제외하고ALTER DYNAMIC TABLE ... REFRESH로 수동 새로 고침을 합니다.ENABLE은 자동 배경 새로 고침 일정을 활성화하며TARGET_LAG를 설정해야 해요.INITIALIZATION_WAREHOUSE = warehouse_name: 모든 동적 테이블 초기화 및 재초기화에 사용할 웨어하우스를 지정해요.TRANSIENT: 테이블이 임시(transient)임을 지정해요. 임시 동적 테이블은 fail-safe 저장소에 데이터를 보존하지 않아 특히 자주 새로 고치는 테이블의 저장 비용을 줄여줘요. 기본값: 값 없음 (영구).REFRESH_MODE = { AUTO | FULL | INCREMENTAL | ADAPTIVE | CUSTOM_INCREMENTAL }: 동적 테이블의 새로 고침 모드를 지정해요.ALTER DYNAMIC TABLE로는 변경할 수 없어요.AUTO: 기본적으로 증분 새로 고침을 시도하지만, 증분이 지원되지 않거나 성능이 나쁠 것으로 예상되면 전체 새로 고침을 자동 선택해요.REFRESH USING절이 있으면AUTO는CUSTOM_INCREMENTAL로 해석돼요. 기본값:AUTO.FULL: 전체 새로 고침을 강제해요.INCREMENTAL: 증분 새로 고침을 강제해요. 쿼리가 증분 새로 고침을 수행할 수 없으면 생성이 실패하고 오류를 표시해요.ADAPTIVE: 기본적으로 증분 새로 고침을 사용하지만, 내부 휴리스틱이 재구축보다 증분이 훨씬 비싸다고 감지하면 자동으로 재초기화해요.CUSTOM_INCREMENTAL:REFRESH USING절에 사용자 정의 MERGE 또는 INSERT 문을 새로 고침 로직으로 사용해요. 이름과 타입이 모두 있는 명시적 컬럼 목록과REFRESH USING절이 필요해요.
REFRESH USING ( dml_statement ): 각 새로 고침에서 Snowflake가 실행하는 DML 문을 지정해요.MERGE INTO SELF ...또는INSERT INTO SELF ...여야 해요.SELF키워드는 생성되는 동적 테이블을 참조해요.INITIALIZE: 동적 테이블의 초기 새로 고침 동작을 지정해요. 생성 후에는 변경할 수 없어요.ON_CREATE: 생성 시 동기적으로 새로 고쳐요. 실패하면 생성이 실패해요. 기본값.ON_SCHEDULE: 다음 예약된 새로 고침에서 새로 고쳐요.
COMMENT 'string_literal': 컬럼에 대한 주석을 지정해요.MASKING POLICY = policy_name: 컬럼에 설정할 마스킹 폴리시를 지정해요.PROJECTION POLICY policy_name: 컬럼에 설정할 프로젝션 폴리시를 지정해요.TAG ( tag_name = 'tag_value' [ , ... ] ): 태그 이름과 문자열 값을 지정해요.column_list: 동적 테이블의 컬럼 이름 변경/주석 추가 시 컬럼 이름 목록을 지정해요. 컬럼의 데이터 타입은 지정할 필요 없어요. 표현식 기반 컬럼이 있으면 각 컬럼 이름을 제공해야 해요.
CREATE DYNAMIC TABLE my_dynamic_table (pre_tax_profit, taxes, after_tax_profit)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
AS
SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate)
FROM staging_table;
WITH CONTACT ( purpose = contact [ , ...] ): 새 객체를 하나 이상의 연락처와 연결해요.ICEBERG_VERSION = integer: 테이블이 따르는 Apache Iceberg™ 사양 버전을 지정해요.2또는3. 기본값:2.TARGET_FILE_SIZE = '{ AUTO | 16MB | 32MB | 64MB | 128MB }': 테이블의 대상 Parquet 파일 크기를 지정해요. 기본값: AUTO.PARTITION BY ( partitionExpression [ , ... ] ): 동적 Iceberg 테이블의 파티션 표현식을 지정해요.PATH_LAYOUT = { FLAT | HIERARCHICAL }: Snowflake가 Parquet 데이터 파일을 쓸 때 사용하는 경로 레이아웃을 지정해요.FLAT는data/디렉터리 아래,HIERARCHICAL은 파티션 컬럼별 디렉터리 구조로 써요. 기본값:FLAT.CLUSTER BY ( expr [ , ... ] ): 동적 테이블의 클러스터링 키로 컬럼/컬럼 표현식을 지정해요.DATA_RETENTION_TIME_IN_DAYS = integer: 동적 테이블의 Time Travel 보존 기간을 지정해요. 값0은 Time Travel을 비활성화해요.MAX_DATA_EXTENSION_TIME_IN_DAYS = integer: 스트림이 오래되지 않도록 Snowflake가 데이터 보존 기간을 연장할 수 있는 최대 일 수를 지정해요.COMMENT = 'string_literal': 동적 테이블에 대한 주석을 지정해요.COPY GRANTS: 새 동적 테이블 생성 시 원본 테이블의 접근 권한을 보존해요.CREATE OR REPLACE DYNAMIC TABLE(… CLONE 포함)에 적용돼요. OWNERSHIP을 제외한 모든 권한을 복사해요.COPY TAGS:CREATE OR REPLACE DYNAMIC TABLE및 그 CLONE 형태에서 태그를 적용해요.ROW ACCESS POLICY policy_name ON ( col_name [ , ... ] ): 동적 테이블에 설정할 행 접근 폴리시를 지정해요.TAG ( tag_name = 'tag_value' [ , ... ] ): 태그 이름과 문자열 값을 지정해요.AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , ... ] ) ]: 동적 테이블에 설정할 집계 폴리시를 지정해요. 선택적ENTITY KEY로 동적 테이블 내 엔티티를 고유하게 식별하는 컬럼을 정의해요.REQUIRE USER: 지정하면 사용자가 지정되지 않은 채 동적 테이블이 실행될 수 없어요. 활성화하면 동적 테이블을ON_SCHEDULE매개변수로 생성해야 해요.FROZEN WHERE: 동적 테이블의 동결 영역(frozen region)을 정의하는 조건을 지정해요.STORAGE LIFECYCLE POLICY policy_name ON ( col_name [ , ... ] ): 동적 테이블에 연결할 저장 수명 주기 폴리시를 지정해요.BACKFILL FROM <table_name>: 백필(backfill)할 데이터 테이블을 지정해요. SELECT 기반 동적 테이블의 경우 동결 영역이 정의한 데이터를 백필하고, 사용자 지정 증분 동적 테이블의 경우 기존 테이블에서 초기 데이터를 제공해요.START AT ({ STREAM => <stream_name> | TIMESTAMP => <timestamp> | STATEMENT => <query_id> | OFFSET => -<seconds> }): 이후 증분 새로 고침이 변경 사항을 소비하기 시작하는 위치를 지정해요.BACKFILL FROM과 사용자 지정 증분 동적 테이블이 필요해요.EXECUTE AS USER user_name: 지정된 사용자로 동적 테이블을 새로 고쳐요.user_name사용자에 IMPERSONATE 권한이 부여된 역할을 사용해야 해요.USE SECONDARY ROLES { ALL | NONE | <role> [ , ... ] }: 동적 테이블에 사용할 보조 역할을 지정해요.EXECUTE AS USER옵션과만 사용할 수 있어요.ROW_TIMESTAMP = { TRUE | FALSE }: 테이블의 행 타임스탬프를 활성화할지 지정해요. OWNERSHIP 권한 역할을 사용해야 해요.WITH DATA METRIC FUNCTION ( dmf_name ON ( col_name [ , ... ] ) [ , ... ] ): 생성 시 하나 이상의 데이터 메트릭 함수(DMF)를 동적 테이블과 연결해요.
접근 제어 요구 사항
| 권한 | 객체 | 참고 |
|---|---|---|
| CREATE DYNAMIC TABLE | 스키마 | 동적 테이블을 만들 스키마. |
| SELECT | 테이블, 뷰, 동적 테이블 | 새 동적 테이블에 쿼리할 객체. |
| USAGE | 웨어하우스 | 테이블을 새로 고치는 데 사용할 웨어하우스. |
| IMPERSONATE | EXECUTE AS USER에 지정된 사용자 | 사용자로 새로 고치려면 그 사용자에 IMPERSONATE 권한이 부여된 역할 필요. |
사용법 참고 사항
CREATE DYNAMIC TABLE명령을 실행하면 현재 사용 중인 역할이 동적 테이블의 소유자가 돼요. 이 역할이 백그라운드에서 테이블의 새로 고침을 수행해요.- 동적 테이블을 만든 후에는 스키마를 변경할 수 없어요.
- 동적 테이블은 기본 객체가 변경될 때 새로 고쳐져요. 동적 테이블이 사용하는 모든 기본 객체에 변경 추적(change tracking)을 활성화해야 해요.
OR REPLACE는 기존 동적 테이블에DROP DYNAMIC TABLE을 수행한 다음 같은 이름으로 만드는 것과 동일해요. Snowflake는 새 동적 테이블을 숨겨진 테이블로 만들고 새로 고침을 실행한 다음 원자적으로 교체해요.COPY TAGS: 태그에 대한 권한이 없어도 사용할 수 있어요. 문에서 태그가 지정된 컬럼 이름을 바꾸거나 데이터 타입을 변경하면 새 동적 테이블의 컬럼이 태그를 유지하지 않아요.OR REPLACE와IF NOT EXISTS절은 상호 배타적이에요.CREATE OR REPLACE <object>문은 원자적이에요.
CREATE OR ALTER DYNAMIC TABLE 사용법 참고 사항
ALTER DYNAMIC TABLE 명령의 모든 제한이 적용돼요. 다음 작업은 지원되지 않아요:
SWAP WITH매개변수로 동적 테이블 교체.RENAME TO매개변수로 이름 변경.CLONE매개변수로 복제.SUSPEND/RESUME(대신ALTER DYNAMIC TABLE … SUSPEND|RESUME사용).TRANSIENT동적 테이블과 비-임시 간 변환.- 태그, 폴리시, 데이터 메트릭 함수 추가/변경. (기존 것은 보존)
- 동적 Iceberg 테이블의
EXTERNAL_VOLUME,CATALOG,BASE_LOCATION변경. - 일반 동적 테이블과 동적 Iceberg 테이블 간 변환.
- 생성 후
BACKFILL FROM변경,START AT추가/변경.
컬럼 변경 규칙:
- 기존 컬럼 드롭은 지원돼요.
- 새 컬럼 추가는 지원되지만 기존 컬럼 끝에만 추가할 수 있어요.
- 동결 영역 조건자나 클러스터링 키로 사용되는 컬럼 드롭은 지원되지 않아요.
- 기존 끝 컬럼의 이름 변경은 지원되지만 다음 새로 고침은 전체 재초기화예요. 목록 끝이 아닌 컬럼은 이름을 바꿀 수 없어요.
- 새 컬럼에
COLLATE추가는 지원되고, 기존 컬럼의 COLLATE 추가/변경/제거는 지원되지 않아요. - 컬럼 수준 마스킹 폴리시, 프로젝션 폴리시, 태그, 연락처 속성 지정은 지원되지 않아요.
암시적 새로 고침 없음: CREATE OR ALTER DYNAMIC TABLE로 기존 동적 테이블을 변경하면 새로 고침을 트리거하지 않아요. 새 동적 테이블을 만들 때 INITIALIZE = ON_CREATE를 지정하면 새로 고침을 트리거해요.
원자성(Atomicity): CREATE OR ALTER DYNAMIC TABLE 명령은 원자성을 보장하지 않아요. 실행 중 실패하면 변경의 일부만 적용될 수 있어요. 오류 메시지에 다음 텍스트가 포함될 수 있어요:
CREATE OR ALTER execution failed. Partial updates may have been applied.
부분 변경에서 복구하려면:
- Fix forward: CREATE OR ALTER DYNAMIC TABLE 문을 다시 실행.
- Roll back:
DESCRIBE DYNAMIC TABLE과SHOW DYNAMIC TABLES로 테이블 상태를 조사하고,ALTER DYNAMIC TABLE문으로 원래 상태로 되돌림.
동결 영역 사용법 참고 사항
- 동적 테이블당 하나의 동결 영역 조건자만 설정할 수 있어요.
- 동결 영역 조건자는 다음을 포함할 수 없어요: 서브쿼리, 비결정적 함수(타임스탬프 함수 제외), 사용자 정의/외부 함수,
METADATA$로 시작하는 메타데이터 컬럼, 집계/창 함수/비결정적 함수에서 나온 컬럼,PARTITION BY컬럼이 아닌 창 함수 연산자를 통과한 컬럼. - 타임스탬프 함수를 사용할 때 동결 영역은 시간이 지나면서 줄어들 수 없어요.
- 동결 영역 조건자에서 참조하는 컬럼은 기본 테이블이 아닌 동적 테이블의 컬럼이어야 해요.
- 동결 영역과 백필 작업: 현재 일반 테이블과 동적 테이블만 백필에 사용할 수 있어요. 새 동적 테이블에 폴리시나 태그를 지정할 수 없어요(백필 테이블에서 복사되기 때문). 새 동적 테이블과 백필 테이블의 클러스터링 키는 같아야 해요.
예제 (Examples)
동적 테이블 my_dynamic_table을 만들어요:
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
AS
SELECT product_id, product_name FROM staging_table;
my_iceberg_table에서 읽는 동적 Iceberg 테이블 my_dynamic_table을 만들어요:
CREATE DYNAMIC ICEBERG TABLE my_dynamic_table (date TIMESTAMP_NTZ, id NUMBER, content STRING)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'my_iceberg_table'
AS
SELECT product_id, product_name FROM staging_table;
다중 컬럼 클러스터링 키가 있는 동적 테이블을 만들어요:
CREATE DYNAMIC TABLE my_dynamic_table (date TIMESTAMP_NTZ, id NUMBER, content VARIANT)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
CLUSTER BY (date, id)
AS
SELECT product_id, product_name FROM staging_table;
지정된 타임스탬프 날짜/시각에 정확히 존재했던 동적 테이블을 복제해요:
CREATE DYNAMIC TABLE my_cloned_dynamic_table CLONE my_dynamic_table AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
새로 고침에 사용자가 필요하도록 구성한 뒤 새로 고쳐요:
CREATE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = 'DOWNSTREAM'
WAREHOUSE = mywh
INITIALIZE = on_schedule
REQUIRE USER
AS
SELECT product_id, product_name FROM staging_table;
ALTER DYNAMIC TABLE my_dynamic_table REFRESH COPY SESSION;
동결 영역이 있는 동적 테이블을 만들어요:
CREATE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '1 hour'
WAREHOUSE = my_warehouse
FROZEN WHERE (ts < CURRENT_TIMESTAMP() - INTERVAL '1 day')
AS
SELECT * FROM source_table;
CREATE OR ALTER DYNAMIC TABLE 명령으로 동적 테이블을 만들어요:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
AS
SELECT a, b FROM t;
데이터 보존 매개변수를 설정하고 클러스터링 키를 추가하려고 동적 테이블을 수정해요:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
DATA_RETENTION_TIME_IN_DAYS = 2
CLUSTER BY (a)
AS
SELECT a, b FROM t;
대상 지연을 수정하고 웨어하우스를 변경해요:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '5 minutes'
WAREHOUSE = my_other_wh
DATA_RETENTION_TIME_IN_DAYS = 2
CLUSTER BY (a)
AS
SELECT a, b FROM t;
DATA_RETENTION_TIME_IN_DAYS 매개변수를 해제해요. 수정된 문에 매개변수가 없으면 해제돼요:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '5 minutes'
WAREHOUSE = my_other_wh
CLUSTER BY (a)
AS
SELECT a, b FROM t;
동적 테이블의 출력으로 v3 Snowflake 관리 Iceberg 테이블을 써요:
CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_v3_table (
num_orders NUMBER(10,0),
order_day
)
TARGET_LAG = '20 minutes'
WAREHOUSE = my_warehouse
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'my_dynamic_iceberg_v3_table'
ICEBERG_VERSION = 3
AS
SELECT
COUNT(DISTINCT order_id)
DATE_TRUNC('DAY', order_timestamp_ns) AS order_day
FROM staging_v3_iceberg_table;
일주일보다 오래된 행을 만료시키는 저장 수명 주기 폴리시가 있는 동적 테이블을 만들어요:
CREATE DYNAMIC TABLE dt_orders
TARGET_LAG = '1 minute'
WAREHOUSE = transform_wh
WITH STORAGE LIFECYCLE POLICY expire_after_1w ON (order_date)
AS
SELECT order_id, customer_id, order_date, product_name, quantity, unit_price, order_status
FROM raw_orders;
더 알아보기 (Learn more)
- ALTER DYNAMIC TABLE
- DESCRIBE DYNAMIC TABLE
- DROP DYNAMIC TABLE
- SHOW DYNAMIC TABLES
- CREATE ICEBERG TABLE (Snowflake as the Iceberg catalog)
- 증분 새로 고침 최적화, 사용자 지정 증분화, ADAPTIVE 새로 고침