기본 키를 사용하여 동적 테이블 파이프라인 최적화

Snowflake는 기본 키를 사용하여 변경 내용 추적 열을 사용하지 않고도 동적 테이블의 행 수준 변경 사항을 추적할 수 있습니다. 이를 통해 일반적으로 다운스트림 증분 처리를 차단하는 전체 새로 고침 동적 테이블을 포함하여 삽입 덮어쓰기 워크로드를 실행하는 파이프라인에 대해 증분 새로 고침을 사용할 수 있습니다.

기본 키는 실제로 데이터의 작은 부분만 변경되는 기본 테이블에서 INSERT OVERWRITE를 수행하는 경우에 특히 효과적입니다. 이러한 경우 기본 키 기반 변경 내용 추적은 전체 테이블을 다시 계산하는 대신 변경된 행만 처리합니다. 기본 키는 덮어쓰기를 수행해도 지속되는 안정적인 행 식별자를 제공합니다.

개념적 배경은 동적 테이블의 기본 키 이해하기 섹션을 참조하세요.

INSERT OVERWRITE 워크로드의 성능 향상

INSERT OVERWRITE를 통해 기본 테이블을 주기적으로 재작성하는 경우 표준 변경 내용 추적 열이 재설정되며, 기본 테이블을 사용하는 동적 테이블에는 기본 테이블의 모든 행에 대한 삽입 및 삭제 세트가 표시됩니다.

다음 예제에서는 외부 프로세스가 dimension_table 을 주기적으로 재작성하지만, 대부분의 행은 동일하게 유지됩니다.

CREATE TABLE dimension_table (
  dim_id INT PRIMARY KEY RELY,
  dim_name VARCHAR,
  category VARCHAR
);

CREATE TABLE fact_table (
  fact_id INT,
  dim_id INT,
  measure FLOAT,
  ts TIMESTAMP
);

CREATE DYNAMIC TABLE enriched_facts
  TARGET_LAG = '30 minutes'
  WAREHOUSE = mywh
  REFRESH_MODE = INCREMENTAL
AS
  SELECT f.fact_id, f.measure, d.dim_name, d.category, f.ts
  FROM fact_table f
  INNER JOIN dimension_table d ON f.dim_id = d.dim_id;

차원 테이블이 INSERT OVERWRITE를 통해 재작성되는 경우, Snowflake는 기본 키를 사용하여 실제로 변경된 차원 행을 식별하며 전체 조인을 다시 계산하는 대신 영향을 받은 팩트만 새로 고칩니다.

전체 새로 고침 동적 테이블의 증분 새로 고침 다운스트림 활성화

일반적으로 REFRESH_MODE = INCREMENTAL 인 동적 테이블은 REFRESH_MODE = FULL 인 동적 테이블에서 읽을 수 없습니다. 전체 새로 고침 동적 테이블에 시스템에서 파생된 고유 키가 있는 경우 명시적으로 새로 고침 모드를 INCREMENTAL로 설정할 수 있습니다.

예: 기본 테이블 기본 키 사용

기본 키가 있는 기본 테이블을 생성하고 Snowflake에서 행 수준 변경 내용 추적에 사용할 수 있도록 RELY 속성을 설정합니다.

CREATE TABLE raw_events (
  event_id INT PRIMARY KEY RELY,
  event_type VARCHAR,
  payload VARIANT,
  created_at TIMESTAMP
);

기본 테이블에서 읽어오는 전체 새로 고침 동적 테이블을 생성합니다. 기본 테이블에는 신뢰할 수 있는 기본 키가 있으므로 Snowflake는 기본 테이블에서 고유 키를 파생하여 동적 테이블에 대한 고유 제약 조건으로 등록할 수 있습니다.

CREATE DYNAMIC TABLE transformed_events
  TARGET_LAG = '10 minutes'
  WAREHOUSE = mywh
  REFRESH_MODE = FULL
AS
  SELECT event_id, event_type, payload:user_id::STRING AS user_id, created_at
  FROM raw_events;

증분 동적 테이블 다운스트림을 생성합니다. 이는 업스트림 테이블에 시스템에서 파생된 신뢰할 수 있는 고유 키가 있기 때문에 작동합니다.

CREATE DYNAMIC TABLE event_summary
  TARGET_LAG = '10 minutes'
  WAREHOUSE = mywh
  REFRESH_MODE = INCREMENTAL
AS
  SELECT user_id, COUNT(*) AS event_count, MAX(created_at) AS last_event
  FROM transformed_events
  GROUP BY user_id;

예: 쿼리에서 파생된 기본 키 사용

동적 테이블의 쿼리에 GROUP BY 절이 포함된 경우 Snowflake는 그룹화 열에서 고유 키를 자동으로 파생합니다. 다운스트림 테이블은 기본 키 기반 변경 내용 추적에 이 파생 키를 사용하고 증분 새로 고침을 활성화할 수 있습니다.

CREATE DYNAMIC TABLE daily_sales
  TARGET_LAG = '1 hour'
  WAREHOUSE = mywh
  REFRESH_MODE = FULL
AS
  SELECT DATE_TRUNC('day', sale_ts) AS sale_day, product_id, SUM(amount) AS total_sales
  FROM sales
  GROUP BY sale_day, product_id;

GROUP BY는 조합당 하나의 행을 보장하므로 daily_sales 테이블에는 파생된 고유 키가 (sale_day, product_id) 에 있습니다. 다운스트림 테이블은 증분식으로 새로 고칠 수 있습니다.

CREATE DYNAMIC TABLE product_trends
  TARGET_LAG = '1 hour'
  WAREHOUSE = mywh
  REFRESH_MODE = INCREMENTAL
AS
  SELECT product_id, AVG(total_sales) AS avg_daily_sales, COUNT(*) AS days_with_sales
  FROM daily_sales
  GROUP BY product_id;

동적 테이블에서 시스템 파생 고유 키 확인

파생된 고유 키가 동적 테이블에 있는지 확인하려면 SHOW UNIQUE KEYS 명령을 사용합니다.

SHOW UNIQUE KEYS IN daily_sales;

출력에 고유 키가 포함된 경우 동적 테이블은 기본 키 기반 변경 내용 추적을 지원합니다. 다운스트림 동적 테이블은 전체 새로 고침 모드를 사용하는 경우라도 REFRESH_MODE = INCREMENTAL 을 사용하여 읽을 수 있습니다.

REFRESH_MODE = INCREMENTAL 인 다운스트림 동적 테이블을 생성하여 지원을 확인할 수도 있습니다. 업스트림 테이블에 신뢰할 수 있는 고유 키가 없으면 오류가 발생하며 생성이 실패합니다.