동적 테이블 만들기¶
이 항목에서는 동적 테이블을 생성하기 위한 핵심 개념을 간략하게 설명합니다.
시작하기 전에 동적 테이블 생성 권한 이 있고 동적 테이블 쿼리에 사용되는 모든 오브젝트에 변경 사항 추적 이 활성화되어 있는지 확인하십시오.
동적 테이블 생성에는 몇 가지 제한 사항이 적용됩니다. 전체 목록은 동적 테이블 제한 사항 섹션을 참조하세요.
참고
증분 새로 고침으로 효율적으로 작동하는 쿼리 작성에 대한 지침은 증분 새로 고침을 위한 쿼리 최적화 섹션을 참조하세요.
변경 내용 추적 활성화¶
증분 새로 고침 모드를 사용하여 동적 테이블을 생성할 때 쿼리하는 테이블에 변경 내용 추적이 아직 활성화되지 않은 경우 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 테이블에서 빈번한 작성 시 복사 작업(예: 업데이트 또는 삭제)은 증분 새로 고침의 성능에 영향을 줄 수 있습니다.
불변성 및 백필이 있는 동적 테이블 생성¶
불변성 제약 조건 </user-guide/dynamic-tables-immutability-constraints>`을 사용하면 동적 테이블의 일부를 정적으로 표시할 수 있습니다. ``IMMUTABLE WHERE` 절을 정의할 때 Snowflake는 새로 고침 중에 해당 행을 건너뛰므로 대량의 과거 데이터가 있는 테이블의 성능이 향상됩니다.
백필은 기존 데이터를 계산하지 않고 동적 테이블에 복사할 수 있도록 하여 불변성 제약 조건을 확장합니다. 이 작업을 수행하면 향후 업데이트를 위해 사용자 지정 새로 고침 쿼리를 정의하는 동안 과거 데이터를 즉시 사용할 수 있습니다.
자세한 내용과 예는 불변성 제약 조건 사용 섹션을 참조하세요.
동적 테이블 만들기의 모범 사례¶
동적 테이블의 파이프라인 연결¶
새로운 동적 테이블을 정의할 때는 많은 중첩된 명령이 있는 대규모 동적 테이블을 정의하는 대신 파이프라인이 있는 작은 동적 테이블을 사용합니다.
동적 테이블을 설정하여 다른 동적 테이블을 쿼리할 수 있습니다. 예를 들어, 데이터 파이프라인이 스테이징 테이블에서 데이터를 추출하여 다양한 차원 테이블(예: customer, product, date, time)을 업데이트하는 시나리오를 가정해 보겠습니다. 또한 파이프라인은 이러한 차원 테이블의 정보를 기반으로 집계 sales 테이블을 업데이트합니다. 차원 테이블이 스테이징 테이블을 쿼리하도록 구성하고, 집계 sales 테이블이 차원 테이블을 쿼리하도록 구성하면 작업 그래프와 유사한 계단식 효과를 만들 수 있습니다.
이 설정에서 집계 sales 테이블에 대한 새로 고침은 차원 테이블에 대한 새로 고침이 완료된 후에만 실행됩니다. 이를 통해 데이터 일관성을 보장하고 지연 목표를 달성할 수 있습니다. 자동화된 새로 고침 프로세스를 통해 소스 테이블이 변경되면 적절한 시간에 모든 종속 테이블에서 새로 고침이 트리거됩니다.
복잡한 작업 그래프에 “컨트롤러” 동적 테이블 사용¶
많은 루트와 리프가 있는 동적 테이블의 복잡한 그래프가 있고 단일 명령으로 전체 작업 그래프에서 작업(예: 지연 변경, 수동 새로 고침, 일시 중단)을 수행하려면 다음을 수행합니다.
모든 동적 테이블의
TARGET_LAG값을DOWNSTREAM으로 설정합니다.작업 그래프의 모든 리프에서 읽는 “컨트롤러” 동적 테이블을 만듭니다.
리프 동적 테이블은 다운스트림 종속성이 없는 태스크 그래프의 노드입니다. 다른 동적 테이블은 이 테이블에서 읽지 않으므로 다른 동적 테이블에는 종속되지 않습니다.
<leaf1>,<leaf2>, …, :code:`<leafN>`을 실제 리프 동적 테이블 이름으로 바꿉니다.이 컨트롤러가 리소스를 사용하지 않도록 하려면 :code:`LIMIT 0`으로 데카르트 조인을 생성합니다.
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 탭을 사용하여 진행 상황을 추적합니다.