동적 테이블 만들기¶
이 항목에서는 동적 테이블을 생성하기 위한 핵심 개념을 간략하게 설명합니다.
시작하기 전에 동적 테이블 생성 권한 이 있고 동적 테이블 쿼리에 사용되는 모든 오브젝트에 변경 사항 추적 이 활성화되어 있는지 확인하십시오.
동적 테이블 생성에는 몇 가지 제한 사항이 적용될 수 있습니다. 전체 목록은 동적 테이블 제한 사항 섹션을 참조하십시오.
변경 내용 추적 활성화¶
증분 새로 고침 모드를 사용하여 동적 테이블을 생성할 때 쿼리하는 테이블에 변경 내용 추적이 아직 활성화되지 않은 경우 Snowflake는 자동으로 해당 테이블에 대한 변경 내용 추적을 활성화하려고 시도합니다. 증분 새로 고침을 지원하려면 동적 테이블에서 사용하는 모든 기본 오브젝트에 대해 0이 아닌 Time Travel 보존 으로 변경 내용 추적을 활성화해야 합니다.
기본 오브젝트가 변경되면 동적 테이블도 변경됩니다. 기본 오브젝트를 다시 생성하는 경우 변경 사항 추적을 다시 활성화해야 합니다.
참고
Snowflake는 전체 새로 고침 모드로 생성된 동적 테이블에서 변경 내용 추적을 자동으로 활성화하려고 시도하지 않습니다.
특정 데이터베이스 오브젝트에 대한 변경 내용 추적을 활성화하려면 해당 오브젝트에 대해 ALTER TABLE, ALTER VIEW 및 유사한 명령을 사용합니다. 동적 테이블을 생성하는 사용자에게 모든 기본 오브젝트에 대한 변경 내용 추적을 활성화할 OWNERSHIP 권한이 있어야 합니다.
변경 내용 추적이 활성화되어 있는지 확인하려면 기본 오브젝트에 대해 SHOW VIEWS, SHOW TABLES 및 유사한 명령을 사용하고 change_tracking
열을 검사하십시오.
지원되는 기본 오브젝트¶
동적 테이블은 다음의 기본 오브젝트를 지원합니다.
테이블
Snowflake 관리형 Apache Iceberg™ 테이블
외부 관리형 Apache Iceberg™ 테이블
예: 간단한 동적 테이블 만들기¶
staging_table
테이블의 product_id
및 product_name
열을 포함하는 동적 테이블을 생성하려고 하며, 다음과 같이 결정한다고 가정합니다.
동적 테이블의 데이터가 :code:`staging_table`의 데이터보다 지연되는 시간을 최대 20분으로 제한하고자 합니다.
:code:`mywh`새로 고침 :ref:`<label-dynamic_tables_intro_refresh_modes> 에 필요한 컴퓨팅 리소스에 대해 ` 웨어하우스를 사용하려고 합니다.
사용자는 새로 고침 모드가 자동으로 선택되기를 원합니다.
Snowflake는 개발 중에만 자동 새로 고침 모드를 사용할 것을 권장합니다. 자세한 내용은 동적 테이블 새로 고침 모드 선택 모범 사례 섹션을 참조하십시오.
사용자는 동적 테이블을 만들 때 동기식으로 새로 고치기를 원합니다.
새로 고침 모드를 자동으로 선택하고 동적 테이블을 생성 시 동기적으로 새로 고치려고 합니다.
이 동적 테이블을 생성하려면 다음 CREATE DYNAMIC TABLE SQL 문을 실행하십시오.
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
REFRESH_MODE = auto
INITIALIZE = on_create
AS
SELECT product_id, product_name FROM staging_table;
매개 변수 및 베리언트 구문의 전체 목록은 CREATE DYNAMIC TABLE 참조를 확인하십시오.
Snowflake 또는 외부 관리형 Apache Iceberg™ 테이블에서 읽는 동적 테이블 만들기¶
Iceberg 테이블에서 동적 테이블을 생성하는 것은 일반 테이블에서 동적 테이블을 생성하는 작업과 유사합니다. Snowflake에서 관리하는 테이블이나 외부 카탈로그에서 관리하는 테이블을 기본 오브젝트로 사용하여 일반 테이블에서와 마찬가지로 CREATE DYNAMIC TABLE SQL 문을 실행합니다.
Snowflake 관리형 Iceberg 테이블에서 기본 테이블로 읽는 동적 테이블은 파이프라인이 Snowflake 관리형 Iceberg 테이블의 데이터에서 작동하도록 하거나 파이프라인이 다른 엔진에서 작성된 Iceberg 테이블에서 작동하도록 하려는 경우에 유용합니다. 외부 엔진은 Snowflake 관리형 Iceberg 테이블에 쓸 수 없습니다. 이러한 테이블은 Snowflake에서는 읽기-쓰기가 가능하지만 외부 엔진에서는 읽기 전용입니다.
AWS Glue와 같이 :ref:`Snowflake가 아닌 외부 카탈로그<label-tables_iceberg_catalog_integration>`에서 관리하고 Apache Spark와 같은 엔진에서 작성된 Iceberg 테이블에서 읽는 동적 테이블은 외부 데이터 레이크의 데이터를 처리하는 데 유용합니다. 외부 관리형 데이터를 기반으로 동적 테이블을 생성하여 데이터를 복제하거나 수집하지 않고도 Snowflake에서 지속적으로 처리할 수 있습니다.
Iceberg 테이블 사용에 대한 제한 사항 및 고려 사항¶
일반 동적 테이블 및 :ref:`동적 Iceberg 테이블<label-dynamic_tables_tasks_create_iceberg_limitations>`에 대한 모든 제한 사항은 계속 적용됩니다.
추가로 다음 사항이 적용됩니다.
Iceberg 기본 테이블에 대한 모든 제한 사항이 적용됩니다. 자세한 내용은 고려 사항 및 제한 사항 섹션을 참조하십시오.
Snowflake 네이티브 테이블, Snowflake 관리형 Iceberg 테이블, 외부 관리형 Iceberg 테이블에서 읽는 동적 테이블을 생성할 수 있습니다.
행 수준에서 변경 사항을 추적하는 다른 기본 테이블과 달리 동적 테이블은 외부 관리형 Iceberg 기본 테이블의 경우 파일 수준에서 변경 사항을 추적합니다. 외부 관리형 Iceberg 테이블에서 빈번한 작성 시 복사 작업(예: 업데이트 또는 삭제)은 증분 새로 고침의 성능에 영향을 줄 수 있습니다.
불변성 제약 조건이 있는 동적 테이블 만들기¶
불변성 제약 조건을 사용하면 동적 테이블이 업데이트되는 방식과 시기를 더 잘 제어할 수 있습니다. 이 제약 조건을 사용하면 전체 테이블이 항상 최신 쿼리 결과를 반영하는 대신 테이블의 일부를 정적으로 유지할 수 있습니다.
동적 테이블의 특정 부분을 변경 불가능으로 표시하여 다음 작업을 수행할 수 있습니다.
기존 데이터에 대한 업데이트 또는 삭제 전파를 방지합니다.
조건을 충족하는 행에 대한 삽입, 업데이트, 삭제를 제한합니다.
테이블의 다른 부분에 대한 증분 업데이트를 계속 활성화하면서 향후 수정을 제한합니다.
테이블의 나머지 부분(즉, 불변성 조건과 일치하지 않는 행)은 변경 가능한 상태로 유지되며 새로 고침 중에 업데이트할 수 있습니다.
불변성 제약 조건을 적용하려면 CREATE DYNAMIC TABLE 또는 ALTER DYNAMIC TABLE 명령을 실행할 때 IMMUTABLE WHERE 매개 변수를 지정합니다. 행이 변경 가능한지 여부를 확인하려면 METADATA$IS_IMMUTABLE
열을 사용합니다. 예: SELECT * , METADATA$IS_IMMUTABLE FROM my_dynamic_table
.
IMMUTABLE WHERE 조건자는 초기 새로 고침 중에 무시되지만 이후의 모든 새로 고침에는 적용됩니다. 전체 새로 고침 모드에서는 조건과 일치하지 않는 행으로만 재계산을 제한합니다. 증분 새로 고침 모드의 스트림 및 동적 테이블은 이러한 전체 새로 고침 테이블에서 읽을 수 있습니다.
불변성 제약 조건 사용의 예¶
다음 예시에서는 동적 테이블을 만들고 IMMUTABLEWHERE 매개 변수를 사용하여 변경 불가능한 테이블로 설정합니다.
CREATE DYNAMIC TABLE my_dynamic_table (id1 INT)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
IMMUTABLE WHERE ( <expr> )
AS
SELECT id AS id1 FROM staging_table;
IMMUTABLE WHERE 조건에서 참조되는 열은 기본 테이블의 열이 아니라 동적 테이블의 열이어야 합니다. 예를 들어, 위 예시의 IMMUTABLE WHERE 표현식은 :code:`id`가 아닌 :code:`id1`만 사용할 수 있습니다.
동적 테이블에는 단일 IMMUTABLE WHERE 조건만 설정할 수 있습니다. 기존 조건자를 바꾸려면 다음 예시에서와 같이 ALTER DYNAMIC TABLE 명령을 사용합니다.
-- Set or replace an existing predicate:
ALTER DYNAMIC TABLE my_dynamic_table SET IMMUTABLE WHERE ( <expr> );
-- Remove an existing predicate:
ALTER DYNAMIC TABLE my_dynamic_table UNSET IMMUTABLE;
동적 테이블의 불변성 제약 조건을 확인하려면 SHOW DYNAMIC TABLES 명령을 실행합니다. immutable_where
열은 테이블에 설정된 IMMUTABLE WHERE 제약 조건을 표시하거나 아무것도 설정되지 않은 경우 NULL을 표시합니다.
컴퓨팅 비용에 대한 자세한 내용은 불변성 제약 조건에 대한 비용 계산 섹션을 참조하세요.
예: IMMUTABLE WHERE를 사용하여 차원 테이블이 변경되는 경우 이전 데이터 재계산 방지¶
다음 예에서는 차원 테이블의 행을 업데이트하면 이전의 모든 팩트 대신 해당 행과 조인된 마지막 날의 팩트가 다시 처리됩니다.
CREATE DYNAMIC TABLE joined_data
TARGET_LAG = '1 minute'
WAREHOUSE = mywh
IMMUTABLE WHERE (timestamp_col < CURRENT_TIMESTAMP() - INTERVAL '1 day')
AS
SELECT F.primary_key primary_key, F.timestamp_col timestamp_col, D.value dim_value
FROM fact_table F
LEFT OUTER JOIN dimension_table D USING (primary_key);
예: 무제한 보존 동적 테이블 및 제한된 보존 기본 테이블¶
다음 예에서는 최근에 추가된 데이터의 윈도우가 제한된 스테이징 테이블과 구문 분석되고 필터링된 모든 데이터를 저장하는 동적 테이블을 만듭니다.
CREATE TABLE staging_data (raw TEXT, ts TIMESTAMP);
CREATE DYNAMIC TABLE parsed_data
TARGET_LAG = '1 minute'
WAREHOUSE = mywh
IMMUTABLE WHERE (ts < CURRENT_TIMESTAMP() - INTERVAL '7 days')
AS
SELECT parse_json(raw):event_id::string event_id, parse_json(raw):name::string name, parse_json(raw):region::string region, ts
FROM staging_data WHERE region = 'US';
-- Delete old staging data using Task
CREATE TASK delete_old_staging_data
WAREHOUSE = mywh
SCHEDULE = '24 hours'
AS
DELETE FROM staging_data WHERE ts < CURRENT_TIMESTAMP() - INTERVAL '30 days';
예: IMMUTABLE WHERE로 전체 새로 고침¶
Python UDTF 사용과 같은 쿼리 구성의 제한 사항으로 인해 동적 테이블이 전체 새로 고침 모드여야 한다고 가정해 보겠습니다. 이는 일반적으로 증분 처리를 방지하지만, IMMUTABLE WHERE 절을 사용하여 변경 불가능한 리전을 정의하면 쿼리 구성 제한 사항으로 인해 업스트림 테이블을 완전히 새로 고쳐야 하는 경우에도 다운스트림 동적 테이블이 증분 상태를 유지하여 성능 최적화의 이점을 계속 누릴 수 있습니다.
다음 예시에서는 Python UDTF를 사용하여 증분할 수 없는 동적 테이블을 보여줍니다.
CREATE FUNCTION my_udtf(x varchar)
RETURNS TABLE (output VARCHAR)
LANGUAGE PYTHON
AS $$ ... $$;
CREATE DYNAMIC TABLE udtf_dt
TARGET_LAG = '1 hour'
WAREHOUSE = mywh
REFRESH_MODE = FULL
IMMUTABLE WHERE (ts < current_timestamp() - interval '1 day')
AS
SELECT ts, data, output, join_key FROM input_table, TABLE(my_udtf(data));
CREATE DYNAMIC TABLE incremental_join_dt
TARGET_LAG = '1 hour'
WAREHOUSE = mywh
REFRESH_MODE = INCREMENTAL
IMMUTABLE WHERE (ts < current_timestamp() - interval '1 day')
AS
SELECT * FROM udtf_dt JOIN dim_table USING (join_key);
불변성 제약 조건 설정 시 제한 사항 및 고려 사항¶
모든 :doc:`일반 동적 테이블의 제한 사항</user-guide/dynamic-tables-limitations>`은 계속 적용됩니다.
추가로 다음 사항이 적용됩니다.
동적 테이블에는 단일 IMMUTABLE WHERE 조건자만 있을 수 있습니다. ALTER DYNAMIC TABLE … SET IMMUTABLE WHERE 명령으로 다른 조건자를 설정하면 기존 조건자가 대체됩니다.
IMMUTABLE WHERE 제약 조건에는 다음 항목을 포함할 수 없습니다.
하위 쿼리.
CURRENT_TIMESTAMP() 또는 CURRENT_DATE()와 같은 타임스탬프 함수를 제외한 비결정적 함수. 타임스탬프 함수를 사용하는 경우 변경 불가능한 리전이 시간이 지남에 따라 증가하도록 함수를 사용해야 합니다. 예를 들어, TIMESTAMP_COL < CURRENT_TIMESTAMP()는 허용되지만 TIMESTAMP_COL > CURRENT_TIMESTAMP()는 허용되지 않습니다.
사용자 정의 함수 또는 외부 함수.
메타데이터 열(예: :code:`METADATA$`로 시작하는 열).
집계, 윈도우 함수 또는 비결정적 함수의 결과로 생성된 열 또는 윈도우 함수 연산자를 통해 전달되는 열. 다음 동적 테이블에서는 IMMUTABLE WHERE 조건자에 :code:`col3`만 사용할 수 있습니다.
CREATE DYNAMIC TABLE aggregates TARGET_LAG = '1 minute' WAREHOUSE = mywh AS SELECT col1, SUM(col2) AS col2 FROM input_table GROUP BY col3; CREATE DYNAMIC TABLE window_fns TARGET_LAG = '1 minute' WAREHOUSE = mywh AS SELECT col3, SUM(col4) OVER (PARTITION BY col3 ORDER BY col4) AS col2, col5 FROM input_table;
IMMUTABLE WHERE 제약 조건은 복제 시 제한 없이 복사됩니다.
백필을 사용하여 동적 테이블 만들기¶
백필은 소스 데이터를 동적 테이블에서 즉시 사용할 수 있도록 하는 저비용의 제로 카피 작업입니다. 향후 업데이트를 위해 사용자 지정 새로 고침 쿼리를 정의하는 동안 일반 테이블에서 백필된 초기 데이터로 동적 테이블을 생성할 수 있습니다.
불변성 제약 조건을 사용하면 변경 불가능한 리전만 백필되고 변경 불가능 리전이 더 이상 소스와 일치하지 않더라도 변경되지 않은 상태로 유지됩니다. 변경할 수 있는 리전은 평소와 같이 동적 테이블의 정의 및 기본 테이블에서 계산됩니다.
백필 데이터가 업스트림 소스와 다르더라도 변경되지 않은 상태로 유지되어야 하므로 :ref:`IMMUTABLE WHERE 불변성 제약 조건<label-create_dt_immutability_constraints>`에 의해 정의된 데이터만 백필할 수 있습니다.
백필 사용의 예¶
다음 예시에서는 백필된 데이터가 있는 테이블에서 새 동적 테이블을 만드는 방법을 보여줍니다.
각 열 이름은 호환되는 데이터 타입이 있는 백필 테이블에서 확인해야 하며 백필 테이블과 동일한 순서로 나타나야 합니다. 백필 테이블의 테이블 속성 및 권한은 복사되지 않습니다.
Time Travel 매개 변수인 :code:`AT | BEFORE`가 지정되면 백필 테이블의 데이터가 지정된 시간에 복사됩니다.
예: 테이블의 일부에서 백필¶
다음 예시에서는 :code:`my_backfill_table`에서 :code:`my_dynamic_table`의 변경 불가능한 리전을 백필하고 동적 테이블 정의에서 변경 가능한 리전을 백필합니다.
이 시나리오에서 동적 테이블이 증분 새로 고침 모드로 생성되는 경우 다시 초기화하면 변경할 수 있는 가능한 모든 행이 삭제되고 변경할 수 없는 리전만 다시 채워집니다. 전체 새로 고침 모드로 동적 테이블을 생성하면 동일한 효과로 전체 새로 고침이 트리거됩니다.
CREATE DYNAMIC TABLE my_dynamic_table (day TIMESTAMP, totalSales NUMBER)
IMMUTABLE WHERE (day < '2025-01-01')
BACKFILL FROM my_backfill_table
TARGET_LAG = '20 minutes'
WAREHOUSE = 'mywh'
AS SELECT DATE_TRUNC('day', ts) AS day, sum(price)
FROM my_base_table
GROUP BY day;
예: 백필을 사용하여 동적 테이블의 데이터 복구 또는 수정하기¶
동적 테이블의 데이터 또는 정의는 직접 편집할 수 없습니다. 데이터를 복구하거나 수정하려면 다음 해결 방법 단계를 완료합니다.
동적 테이블을 일반 테이블로 복제합니다.
필요에 따라 복제된 테이블을 수정합니다.
편집된 테이블에서 새 동적 테이블로 백필합니다.
다음 예시에서 my_dynamic_table`은 :code:`sales
기본 테이블에서 일일 판매 데이터를 집계합니다.
CREATE OR REPLACE TABLE sales(item_id INT, ts TIMESTAMP, sales_price FLOAT);
INSERT INTO sales VALUES (1, '2025-05-01 01:00:00', 10.0), (1, '2025-05-01 02:00:00', 15.0), (1, '2025-05-01 03:00:00', 11.0);
INSERT INTO sales VALUES (1, '2025-05-02 00:00:00', 11.0), (1, '2025-05-02 05:00:00', 13.0);
CREATE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = 'DOWNSTREAM'
WAREHOUSE = mywh
INITIALIZE = on_create
IMMUTABLE WHERE (day <= '2025-05-01')
AS
SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count FROM sales
GROUP BY item_id, day;
SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
+---------+------------+-------------+
| ITEM_ID | DAY | SALES_COUNT |
|---------+------------+-------------|
| 1 | 2025-05-01 | 3 |
| 1 | 2025-05-02 | 2 |
|---------+-------------+------------|
필요에 따라 이전 데이터를 아카이브하여 저장소 비용을 절감할 수 있습니다.
DELETE FROM sales WHERE ts < '2025-05-02';
ALTER DYNAMIC TABLE my_dynamic_table REFRESH;
SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
나중에 :code:`2025-05-01`에서 판매 오류를 발견하게 되는데, 여기서 :code:`sales_count`는 2여야 합니다. 이 문제를 수정하려면 다음을 수행합니다.
:code:`my_dynamic_table`을 일반 테이블에 복제합니다.
CREATE OR REPLACE TABLE my_dt_clone_table CLONE my_dynamic_table;
복제된 테이블을 업데이트합니다.
UPDATE my_dt_clone_table SET sales_count = 2 WHERE day = '2025-05-01'; SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dt_clone_table;
+---------+------------+-------------+ | ITEM_ID | DAY | SALES_COUNT | |---------+------------+-------------| | 1 | 2025-05-01 | 2 | | 1 | 2025-05-02 | 2 | |---------+-------------+------------|
편집된 복제본을 백필 소스로 사용하여 동적 테이블을 다시 생성합니다.
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table BACKFILL FROM my_dt_clone_table IMMUTABLE WHERE (day <= '2025-05-01') TARGET_LAG = 'DOWNSTREAM' WAREHOUSE = mywh INITIALIZE = on_create AS SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count FROM sales GROUP BY item_id, day;
이 접근 방식을 사용하면 기본 테이블을 수정하지 않고도 동적 테이블의 데이터를 복구하거나 수정할 수 있습니다.
SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
+---------+------------+-------------+ | ITEM_ID | DAY | SALES_COUNT | |---------+------------+-------------| | 1 | 2025-05-01 | 2 | | 1 | 2025-05-02 | 2 | |---------+-------------+------------|
예: 백필을 사용하여 동적 테이블의 스키마 수정하기¶
동적 테이블의 스키마는 직접 변경할 수 없습니다. 예를 들어, 열을 추가하는 등 스키마를 업데이트하려면 다음 단계를 따릅니다.
동적 테이블을 일반 테이블로 복제합니다. 다음 예시에서는
sales`(:ref:`상기<label-data-surgery-example>
)에서 생성된 :code:`my_dynamic_table`을 사용합니다.CREATE OR REPLACE TABLE my_dt_clone_table CLONE my_dynamic_table;
복제된 테이블의 스키마를 수정합니다.
ALTER TABLE my_dt_clone_table ADD COLUMN sales_avg FLOAT; SELECT item_id, to_char(day, 'YYYY-MM-DD') as DAY, SALES_COUNT, SALES_AVG FROM my_dt_clone_table;
필요에 따라 새 열에 데이터를 채웁니다.
편집된 복제본을 백필 소스로 사용하여 동적 테이블을 다시 생성합니다.
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table BACKFILL FROM my_dt_clone_table IMMUTABLE WHERE (day <= '2025-05-01') TARGET_LAG = 'DOWNSTREAM' WAREHOUSE = mywh INITIALIZE = on_create AS SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count, avg(sales_price) as sales_avg FROM sales GROUP BY item_id, day;
이 접근 방식을 사용하면 기본 테이블을 수정하지 않고도 동적 테이블의 데이터를 복구하거나 수정할 수 있습니다.
SELECT item_id, to_char(day, 'YYYY-MM-DD') as DAY, SALES_COUNT, SALES_AVG, metadata$is_immutable as IMMUTABLE from my_dynamic_table ORDER BY ITEM_ID, DAY;
+---------+------------+-------------+-----------+-----------+ | ITEM_ID | DAY | SALES_COUNT | SALES_AVG | IMMUTABLE | |---------+------------+-------------|-----------|-----------| | 1 | 2025-05-01 | 3 | NULL | TRUE | | 1 | 2025-05-02 | 2 | 12 | FALSE | |---------+-------------+------------+-----------|-----------+
백필된 데이터로 동적 테이블 생성 시 제한 사항 및 고려 사항¶
모든 일반 동적 테이블의 제한 사항 및 :ref:`불변성 제약 조건의 제한 사항<label-dts_immutability_constraints_limitations>`은 계속 적용됩니다.
다음과 같은 추가 제한 사항 및 고려 사항이 적용됩니다.
현재는 일반 테이블만 백필에 사용할 수 있습니다.
정책이나 태그는 백필 테이블에서 복사되므로 새 동적 테이블에서 지정할 수 없습니다.
새 동적 테이블과 백필 테이블의 클러스터링 키는 동일해야 합니다.
동적 테이블 만들기의 모범 사례¶
동적 테이블의 파이프라인 연결¶
새로운 동적 테이블을 정의할 때는 많은 중첩된 명령이 있는 대규모 동적 테이블을 정의하는 대신 파이프라인이 있는 작은 동적 테이블을 사용합니다.
동적 테이블을 설정하여 다른 동적 테이블을 쿼리할 수 있습니다. 예를 들어, 데이터 파이프라인이 스테이징 테이블에서 데이터를 추출하여 다양한 차원 테이블(예: customer
, product
, date
, time
)을 업데이트하는 시나리오를 가정해 보겠습니다. 또한 파이프라인은 이러한 차원 테이블의 정보를 기반으로 집계 sales
테이블을 업데이트합니다. 차원 테이블이 스테이징 테이블을 쿼리하도록 구성하고, 집계 sales
테이블이 차원 테이블을 쿼리하도록 구성하면 작업 그래프와 유사한 계단식 효과를 만들 수 있습니다.
이 설정에서 집계 sales
테이블에 대한 새로 고침은 차원 테이블에 대한 새로 고침이 완료된 후에만 실행됩니다. 이를 통해 데이터 일관성을 보장하고 지연 목표를 달성할 수 있습니다. 자동화된 새로 고침 프로세스를 통해 소스 테이블이 변경되면 적절한 시간에 모든 종속 테이블에서 새로 고침이 트리거됩니다.

복잡한 작업 그래프에 “컨트롤러” 동적 테이블 사용¶
많은 루트와 리프가 있는 동적 테이블의 복잡한 그래프가 있고 단일 명령으로 전체 작업 그래프에서 작업(예: 지연 변경, 수동 새로 고침, 일시 중단)을 수행하려면 다음을 수행합니다.
모든 동적 테이블의
TARGET_LAG
값을DOWNSTREAM
으로 설정합니다.작업 그래프의 모든 리프에서 읽는 “컨트롤러” 동적 테이블을 만듭니다. 이 컨트롤러가 리소스를 소모하지 않도록 하려면 다음을 수행합니다.
CREATE DYNAMIC TABLE controller TARGET_LAG = <target_lag> WAREHOUSE = <warehouse> AS SELECT 1 A FROM <leaf1>, …, <leafN> LIMIT 0;
컨트롤러를 사용하여 전체 그래프를 제어합니다. 예:
작업 그래프에 대한 새로운 목표 지연을 설정합니다.
ALTER DYNAMIC TABLE controller SET TARGET_LAG = <new_target_lag>;작업 그래프를 수동으로 새로 고칩니다.
ALTER DYNAMIC TABLE controller REFRESH;
일시적 동적 테이블을 사용하여 저장소 비용 절감¶
일시적 동적 테이블은 시간이 지나도 데이터를 안정적으로 유지하고 데이터 보존 기간 내에서 Time Travel을 지원하지만, Fail-safe 기간 이후에는 데이터를 보존하지 않습니다. 기본적으로 동적 테이블 데이터는 fail-safe 저장소에 7일 동안 보관됩니다.
새로 고침 처리량이 높은 동적 테이블의 경우 저장소 사용량이 크게 늘어날 수 있습니다. 따라서 동적 테이블은 영구 테이블에서 제공하는 것과 동일한 수준의 데이터 보호 및 복구가 필요하지 않은 경우에만 일시적 테이블로 설정해야 합니다.
CREATE DYNAMIC TABLE 문을 사용하여 일시적 동적 테이블을 만들거나 기존 동적 테이블을 일시적 동적 테이블로 복제할 수 있습니다.
동적 테이블 생성 문제 해결¶
동적 테이블을 생성할 때 초기 새로 고침은 일정(ON_SCHEDULE
) 또는 생성 시 즉시(ON_CREATE
) 발생합니다. 초기 데이터 채우기 또는 :ref:`초기화<label-dynamic_tables_initialization>`는 이 초기 새로 고침이 발생하는 시점에 따라 다릅니다. 예를 들어, :code:`ON_CREATE`의 경우, 초기화는 업스트림 동적 테이블의 새로 고침을 트리거하는 경우 더 오래 걸릴 수 있습니다.
검색되는 데이터의 양에 따라 초기화하는 데 다소 시간이 걸릴 수 있습니다. 진행 상황을 보려면 다음을 수행합니다.
Snowsight 에 로그인합니다.
탐색 메뉴에서 Monitoring » Query History 를 선택합니다.
Filters 드롭다운에서 Warehouse 필터에 SQL Text 를 입력하고 CREATE DYNAMIC TABLE 필터에 웨어하우스 이름을 입력합니다.
SQL text 아래에서 동적 테이블이 있는 쿼리를 선택하고 Query Details 및 Query Profile 탭을 사용하여 진행 상황을 추적합니다.