동적 테이블 새로 고침 경계

동적 테이블 새로 고침 경계를 사용하여 업스트림 결과를 계속 읽는 동안 동적 테이블 파이프라인을 분리합니다.

하나의 동적 테이블이 다른 동적 테이블을 참조하면 두 테이블이 단일 파이프라인으로 함께 새로 고쳐집니다. 이는 대부분의 시나리오에서 작동하지만, 데이터 새로 고침 요구 사항이 다를 수 있는 팀 경계를 넘어 데이터를 공유하는 등의 특정 사용 사례가 있습니다. 업스트림 참조를 DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 래핑하여 두 동적 테이블을 독립적으로(따라서 다른 파이프라인에 속함) 선언할 수 있습니다. 스냅샷 격리는 단일 파이프라인 내에서만 보장되므로 새로 고침 경계를 넘어서는 동적 테이블은 서로 스냅샷 격리를 제공하지 않습니다.

개요

기본적으로, 동적 테이블이 다른 동적 테이블에서 읽을 때 Snowflake는 다음을 수행합니다.

  • 단일 파이프라인의 일부로 두 테이블을 함께 새로 고칩니다.

  • 파이프라인의 모든 업스트림 동적 테이블에서 다운스트림 동적 테이블이 스냅샷 격리 를 확인할 수 있도록 좌표가 새로 고침됩니다.

  • 대상 지연 검사와 같은 파이프라인 수준 규칙을 적용합니다.

일부 파이프라인에서는 모든 관계로 인해 두 동적 테이블이 동시에 새로 고침되는 것이 바람직하지 않을 수 있습니다. 일반적인 몇 가지 예는 다음과 같습니다.

  • 한 팀에서 다른 팀이 사용하는 동적 테이블을 게시하지만 다운스트림 동적 테이블이 업스트림 파이프라인에 영향을 미치거나 상속해서는 안 되는 팀 간 파이프라인.

  • 업스트림 파이프라인 단계를 동적 테이블로 변환하지만 다운스트림 컨슈머가 새로 고침 조정을 시작하지 않도록 하려는 증분 마이그레이션.

  • 동적 테이블이 다른 동적 테이블을 쿼리하는 뷰에서 읽는 Dynamic-table-on-view-on-dynamic-table 패턴. 이 패턴은 뷰가 DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 래핑되지 않는 한 지원되지 않습니다.

새로 고침 경계는 이러한 구분을 명시적으로 만듭니다. 경계 내부의 입력은 별도의 파이프라인에 속한 것으로 처리되고 일반 테이블처럼 읽습니다.

구문

DYNAMIC_TABLE_REFRESH_BOUNDARY( <object_name> )

여기서

object_name

테이블, 뷰, 동적 테이블 또는 공통 테이블 식(CTE) 이름입니다.

동적 테이블 정의의 FROM/JOIN 절(CTEs 및 UNION 분기 내 포함)에 이 키워드를 사용합니다.

다음 예제에서는 다른 동적 테이블을 쿼리하는 뷰에서 입력을 읽어옵니다. 새로 고침 경계가 없는 경우 다른 동적 테이블의 뷰에서 읽어오는 동적 테이블 생성은 지원되지 않습니다. DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 뷰를 래핑하면 이 패턴이 가능해집니다.

CREATE DYNAMIC TABLE analytics.click_analytics_dt
  WAREHOUSE = analytics_wh
  TARGET_LAG = '5 minutes'
AS
SELECT *
FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(analytics.enriched_clicks_view);

다음 예제에서는 더 긴 일정으로 업스트림 동적 테이블을 새로 고치는 뷰와 직접 참조된 동적 테이블을 조인합니다. DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 뷰를 래핑하면 다운스트림 동적 테이블이 5분마다 비용이 많이 드는 업스트림 새로 고침을 트리거하는 것을 방지하면서 사용 가능한 최신 버전을 읽을 수 있도록 허용합니다. 스냅샷 격리는 새로 고침 경계를 넘어서 보장되지 않습니다.

CREATE DYNAMIC TABLE data_eng.enriched_clicks_dt
  WAREHOUSE = de_wh
  TARGET_LAG = '5 minutes'
AS
SELECT
  c.*,
  p.product_name
FROM data_eng.clickstream_dt AS c
LEFT JOIN DYNAMIC_TABLE_REFRESH_BOUNDARY(product_db.active_products_view) AS p
  ON c.product_id = p.product_id;

동작

새로 고침 경계가 종속성을 변경하는 방법

동적 테이블 정의 내에서 입력을 DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 래핑하는 경우:

  • 해당 입력은 이 정의에 대한 새로 고침 경계 입력으로 처리됩니다.

  • 해당 입력에서 연결할 수 있는 모든 동적 테이블은 이 정의의 파이프라인에 포함되지 않습니다.

  • 새로 고침 시 동적 테이블은 파이프라인 전체에서 조정된 데이터 타임스탬프가 아닌 현재 버전에서 해당 오브젝트를 읽습니다.

그 결과:

경계를 넘어선 연속 새로 고침 없음

다운스트림 동적 테이블을 새로 고쳐도 새로 고침 경계를 통해서만 연결할 수 있는 동적 테이블의 새로 고침은 트리거되지 않습니다.

독립적인 예약

다운스트림 동적 테이블에 대한 목표 지연 및 새로 고침 예약은 경계를 통해서만 연결할 수 있는 동적 테이블을 무시합니다.

경계를 넘어선 스냅샷 격리 없음

다운스트림 동적 테이블은 새로 고침 시 사용할 수 있는 업스트림 데이터의 버전에 관계없이 입력을 읽습니다. 경계를 넘어서는 데이터는 다른 업스트림 종속성에 적용되는 스냅샷 격리 에 맞춰 조정되지 않을 수 있습니다.

스냅샷 격리 및 새로 고침 경계

단일 파이프라인(경계 없음) 내에서 Snowflake는 해당 파이프라인에 참여하는 모든 업스트림 동적 테이블에서의 스냅샷 격리 를 보장합니다.

새로 고침 경계는 경계를 가로지르는 종속성에 대한 이러한 보장을 의도적으로 약화시킵니다.

  • 경계 내부: 오브젝트는 자체 파이프라인에 따라 새로 고쳐지고 조정됩니다.

  • 경계 외부: 다운스트림 동적 테이블은 새로 고침 시 사용 가능한 버전을 읽습니다.

따라서 단일 동적 테이블 정의는 다음 두 가지 유형의 입력을 모두 참조할 수 있습니다.

  • 파이프라인 내에서 스냅샷 격리 및 조정된 새로 고침에 참여하는 업스트림 동적 테이블에 대한 직접 참조.

  • 스냅샷 격리 없이 사용 가능한 최신 버전의 업스트림 데이터를 독립적으로 읽는 새로 고침 경계 참조.

업스트림 동적 테이블과 다운스트림 동적 테이블 사이에 스냅샷 격리가 필요하지 않은 종속성에만 새로 고침 경계를 사용합니다.

사용 사례

팀 간 파이프라인 분리하기

다른 팀은 논리적 파이프라인의 다른 부분을 소유할 수 있습니다.

  • A팀: 조직 전체에서 사용되는 핵심 동적 테이블을 게시합니다.

  • 팀 B: 핵심 동적 테이블을 팀별 데이터와 조인하는 다운스트림 동적 테이블을 정의합니다.

팀 B는 새로 고침 경계에서 팀 A의 출력을 다음과 같이 래핑할 수 있습니다.

  • 팀 A의 동적 테이블을 자체 파이프라인으로 가져오지 않도록 방지합니다.

  • 자체 새로 고침 일정을 독립적으로 유지합니다.

  • 팀 A의 동적 테이블을 주기적으로 업데이트되는 외부 테이블과 유사하게 처리합니다.

동적 테이블의 뷰에서 동적 테이블 활성화하기

새로 고침 경계가 없는 경우 다른 동적 테이블의 뷰에서 읽어오는 동적 테이블 생성은 지원되지 않습니다. 새로 고침 경계를 사용하면 뷰 종속성을 경계로 명시적으로 표시할 수 있습니다.

CREATE VIEW v_orders AS
SELECT *
FROM orders_dt;

CREATE DYNAMIC TABLE order_summary_dt
  WAREHOUSE = analytics_wh
  TARGET_LAG = '15 minutes'
AS
SELECT
  customer_id,
  COUNT(*) AS num_orders
FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(v_orders)
GROUP BY customer_id;

여기서, order_summary_dt 는 다음과 같습니다.

  • 새로 고침 경계를 통해 ``orders_dt``에서 읽어옵니다.

  • orders_dt 와 동일한 파이프라인에 속하지 않습니다.

  • 새로 고침 시 orders_dt 의 버전에 관계없이 읽습니다.

예: 팀 소유 경계 뷰

일반적인 패턴은 한 팀이 동적 테이블 및 그 위에 있는 뷰를 모두 소유하고 뷰 정의 내에 새로 고침 경계를 적용하는 것입니다. 그런 다음 다른 팀은 소유 팀의 동적 테이블에 새로운 종속성을 도입하지 않고 해당 뷰를 사용합니다.

-- Team A: owns product_catalog_dt and publishes a boundary view
CREATE DYNAMIC TABLE product.product_catalog_dt
  WAREHOUSE = product_wh
  TARGET_LAG = '1 hour'
AS
SELECT *
FROM product.raw_products;

CREATE VIEW product.active_products_public_v AS
SELECT * FROM DYNAMIC_TABLE_REFRESH_BOUNDARY(product.product_catalog_dt)
WHERE is_active = TRUE;

-- Team B: consumes Team A's view in their own dynamic table
CREATE DYNAMIC TABLE analytics.active_product_clicks_dt
  WAREHOUSE = analytics_wh
  TARGET_LAG = '5 minutes'
AS
SELECT
  c.*,
  p.product_name
FROM analytics.clickstream_dt AS c
JOIN product.active_products_public_v AS p
  ON c.product_id = p.product_id;

이 패턴에서:

  • 팀 A는 product.active_products_public_v 내부에 product_catalog_dt 를 래핑하여 새로 고침 경계를 제어합니다.

  • 팀 B와 다른 팀은 게시된 뷰만 참조하는 자체 동적 테이블을 정의합니다.

  • 이러한 다운스트림 동적 테이블은 자체 파이프라인에 product_catalog_dt 를 추가하지 않으며, product_catalog_dt 는 데이터가 뷰를 통해 표시되더라도 파이프라인 외부에 유지됩니다.

동적 테이블로의 증분 마이그레이션

기존 파이프라인 단계를 동적 테이블로 마이그레이션하는 경우, 다운스트림 컨슈머가 다음을 수행하지 않도록 방지할 수 있습니다.

  • 새 동적 테이블의 새로 고침 트리거를 시작합니다.

  • 새로운 목표 지연 요구 사항을 상속합니다.

새로 고침 경계에서 새 동적 테이블(또는 그 위에 있는 뷰)을 래핑하면 다운스트림 동적 테이블이 동일한 파이프라인에 추가되지 않고 테이블을 사용할 수 있습니다.

목표 지연

새로 고침 경계는 목표 지연이 적용되는 방식에도 영향을 미칩니다.

업스트림 동적 테이블의 목표 지연은 동일한 파이프라인 내의 모든 다운스트림 동적 테이블의 목표 지연과 동일하거나 더 짧아야 합니다. DYNAMIC_TABLE_REFRESH_BOUNDARY() 를 통해 참조되는 동적 테이블은 동일한 파이프라인에 속하지 않으므로 이 규칙은 경계 전체에 적용되지 않습니다.

새로 고침 경계 내의 업스트림 동적 테이블은 자체 목표 지연 및 일정 동작을 유지하며, 경계를 넘어서는 다운스트림 선택에 의해 강화되거나 완화되지 않습니다.

제약 및 제한 사항

새로 고침 경계에는 몇 가지 중요한 규칙이 적용됩니다.

새로 고침 경계 내부와 외부 모두에서 동일한 동적 테이블은 허용되지 않음

단일 정의 내의 동일한 업스트림 동적 테이블에 대한 모든 참조는 정의에 직접 포함되거나 DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 래핑되어야 합니다. 둘 다 혼합하면 동일한 동적 테이블을 다른 버전에서 읽을 수 있습니다. Snowflake는 이러한 정의를 차단하고 설명이 포함된 오류를 반환합니다.

지원되지 않는 경계 대상

DYNAMIC_TABLE_REFRESH_BOUNDARY() 는 명명된 오브젝트(테이블, 뷰, 동적 테이블 또는 CTE )를 래핑해야 합니다. 다음은 래핑할 수 없습니다.

  • 인라인 하위 쿼리.

  • 테이블 함수 또는 UDTFs.

  • 임의의 TABLE(...) 호출.

동적 테이블 외부의 효과

일반 SELECT 쿼리에서 DYNAMIC_TABLE_REFRESH_BOUNDARY() 를 호출할 수 있지만, 동적 테이블 정의 외부에서는 작업이 수행되지 않습니다.

모범 사례

동적 테이블 파이프라인에서 새로 고침 경계를 사용하는 경우:

다음과 같은 경우 새로 고침 경계 사용:

  • 파이프라인에 조인하지 않고 다른 팀의 동적 테이블을 사용하려고 합니다.

  • 특정 업스트림 종속성에서 스냅샷을 격리할 필요가 없습니다.

  • 동적 테이블이 다른 동적 테이블을 참조하는 뷰에 종속됩니다. 이 패턴은 뷰 또는 업스트림 동적 테이블이 DYNAMIC_TABLE_REFRESH_BOUNDARY() 로 래핑된 경우에만 지원됩니다.

다음과 같은 경우 새로 고침 경계 사용 안 함:

  • 해당 종속성에 대한 스냅샷 격리가 필요합니다.

  • 다운스트림 새로 고침을 업스트림 동적 테이블과 연동하고 필요한 경우 연속 새로 고침을 수행하려고 합니다.

  • 전체 파이프라인에서 전역 목표 지연 관계를 사용합니다.