동적 테이블 클론하기

동적 테이블 클론하기

클로닝(cloning)은 데이터를 물리적으로 복사하지 않고 소스와 같은 컬럼 정의와 데이터를 가진 새 동적 테이블을 만들어요. 이 페이지는 단일 동적 테이블 클론, 동적 테이블을 일반 테이블로 클론, 전체 파이프라인 클론 방법을 설명해요.

전체 구문 참조는 CREATE DYNAMIC TABLE … CLONE 문서를 참조하세요.

클론은 생성 후 일시 중단(suspended)돼요. 스케줄에 따라 갱신되기 전에 클론된 동적 테이블을 다시 시작하세요(클론된 동적 테이블 다시 시작 참조).

출처: Snowflake 문서

본문

동적 테이블 클론

가장 단순한 클론은 Snowflake의 제로 복사 클로닝(zero-copy cloning)을 통해 소스의 데이터를 공유하는 동일한 동적 테이블을 만들어요:

CREATE DYNAMIC TABLE dt_orders_clone CLONE dt_orders;

클론은 컬럼 정의, 정의(definition), target lag, 웨어하우스, 갱신 모드, INITIALIZE 설정, frozen region, 클러스터링 키, 연결된 스토리지 수명 주기 정책을 포함한 소스의 속성을 상속해요. 소스의 갱신 기록이나 스케줄링 상태는 상속하지 않아요.

타임 트래블과 함께 클론

과거의 특정 시점에 존재했던 동적 테이블을 클론할 수 있어요:

CREATE DYNAMIC TABLE dt_orders_clone
  CLONE dt_orders
    AT (TIMESTAMP => '2025-01-16 12:00:00'::TIMESTAMP_TZ);

AT와 BEFORE 절에 대한 자세한 내용은 타임 트래블 이해 및 사용 문서를 참조하세요.

클론 시점에 속성 재정의

동적 테이블을 클론할 때 target lag와 웨어하우스를 변경할 수 있어요:

CREATE DYNAMIC TABLE dt_orders_dev
  CLONE dt_orders
  COPY GRANTS
  TARGET_LAG = '1 hour'
  WAREHOUSE = transform_wh;

클론된 동적 테이블에 기존 권한 부여를 유지하려면 COPY GRANTS를 사용하세요.

동적 Iceberg 테이블 클론

일반 동적 테이블을 클론하는 것과 같은 방식으로 동적 Iceberg 테이블을 새 동적 Iceberg 테이블로 클론할 수 있어요:

CREATE DYNAMIC ICEBERG TABLE dt_orders_iceberg_clone
  CLONE dt_orders_iceberg;

클론은 항상 Snowflake 관리 Iceberg 테이블이에요. 클론 문에서 EXTERNAL_VOLUME, CATALOG, BASE_LOCATION을 설정할 수 없어요. 이 옵션 중 하나를 지정하면 오류가 반환돼요. Snowflake는 클론에 자체 base location을 할당해요. 클론은 또한 소스의 Iceberg format version을 유지해요.

타임 트래블, COPY GRANTS, target lag·웨어하우스 재정의는 일반 동적 테이블과 동일하게 작동해요. 예를 들어 이전 시점의 동적 Iceberg 테이블을 클론하고 target lag와 웨어하우스를 재정의할 수 있어요:

CREATE DYNAMIC ICEBERG TABLE dt_orders_iceberg_dev
  CLONE dt_orders_iceberg
    AT (TIMESTAMP => '2025-01-16 12:00:00'::TIMESTAMP_TZ)
  COPY GRANTS
  TARGET_LAG = '1 hour'
  WAREHOUSE = transform_wh;

동적 Iceberg 테이블을 포함한 스키마나 데이터베이스를 클론하면 클론에는 스키마나 데이터베이스의 다른 객체와 함께 동적 Iceberg 테이블이 포함돼요.

동적 Iceberg 테이블을 Snowflake 관리 Iceberg 테이블로 클론

동적 Iceberg 테이블 데이터의 정적 스냅샷을 만들려면 Snowflake 관리 Iceberg 테이블로 클론하세요. 결과 Iceberg 테이블은 같은 컬럼과 데이터를 가지지만 갱신 스케줄, target lag, 웨어하우스 할당이 없어요:

CREATE ICEBERG TABLE orders_iceberg_snapshot
  CLONE dt_orders_iceberg;

소스 동적 Iceberg 테이블은 Snowflake 관리 Iceberg 테이블로 클론하려면 먼저 초기화(initialized)되어야 해요. 제한 사항 문서를 참조하세요.

동적 테이블을 일반 테이블로 클론

동적 테이블 데이터의 정적 스냅샷을 만들려면 일반 테이블로 클론하세요. 결과 테이블은 같은 컬럼과 데이터를 가지지만 갱신 스케줄, target lag, 웨어하우스 할당이 없어요:

CREATE TABLE orders_snapshot CLONE dt_orders;

클론된 테이블은 소스 동적 테이블의 행 접근 정책, 마스킹 정책, 태그, 클러스터링 키, comment를 유지해요.

동적 테이블을 일반 테이블로 클론하는 데는 다음 요구 사항이 있어요:

  • 소스 동적 테이블이 초기화(initialized)되어야 해요. 초기화되지 않은 동적 테이블은 초기 갱신을 완료하지 못했으므로 클론할 구체화된 스냅샷이 없어요.
  • 동적 Iceberg 테이블은 일반 테이블로 클론할 수 없어요. 동적 Iceberg 테이블을 클론하려면 새 동적 Iceberg 테이블 또는 Snowflake 관리 Iceberg 테이블로 클론하세요. 동적 Iceberg 테이블 클론 문서를 참조하세요.

오류: 초기화되지 않은 동적 테이블 클론

초기화되지 않은 동적 테이블을 일반 테이블로 클론하려고 하면 다음 오류가 나요:

CREATE TABLE dt_uninitialized_snapshot CLONE dt_uninitialized;
Cannot clone an uninitialized dynamic table. Please run a manual refresh or wait for a scheduled refresh before cloning.

해결하려면 소스 동적 테이블에서 수동 갱신을 먼저 실행하거나, 초기화가 필요 없는 다른 동적 테이블로 클론하세요.

전체 파이프라인 클론

동적 테이블이 다른 동적 테이블이나 기본 테이블에 의존할 때는 개별 객체가 아니라 전체 스키마나 데이터베이스를 클론하세요. 이렇게 하면 파이프라인 객체 간 관계가 보존되어, 그렇지 않으면 일어나는 재초기화(reinitialization)를 피할 수 있어요.

CREATE SCHEMA analytics_dev CLONE analytics_prod;

스키마 수준 CLONE은 모든 객체(기본 테이블, 뷰, 동적 테이블)를 함께 복사하며 그 관계를 보존해요. 클론된 스키마에서 정의의 비정규화(비수식) 객체 참조는 클론된 복사본으로 해결되므로 파이프라인이 완전히 독립적이 돼요. 그러나 완전 수식 참조(예: other_schema.table_name)는 여전히 원본 객체를 가리켜 교차 스키마 의존성을 만들 수 있어요.

업스트림 객체 없이 단일 동적 테이블을 클론하면 클론은 여전히 원본 업스트림 테이블을 참조해요. 이는 환경 간 의존성을 만들어 예상치 못한 동작(재초기화 또는, 클론 시점에 기본 객체가 없었다면 갱신 실패)을 유발할 수 있어요.

클론 범위 파이프라인 보존? 재초기화 위험 사용 시기
단일 동적 테이블 (같은 스키마) 아니요 (원본 업스트림 객체 참조) 낮음 업스트림 의존성이 없는 격리된 동적 테이블
단일 동적 테이블 (교차 스키마) 아니요 (원본 업스트림 객체 참조) 더 높음 공유 업스트림 소스로 테스트
스키마 클론 예 (모든 객체가 함께 클론됨) 더 낮음 한 스키마에 포함된 파이프라인
데이터베이스 클론 예 (모든 객체가 함께 클론됨) 가장 낮음 개발이나 테스트용 전체 환경 복사본

클론된 동적 테이블 다시 시작

모든 클론된 동적 테이블은 클로닝 후 일시 중단돼요. DYNAMIC_TABLE_GRAPH_HISTORY에서 이는 scheduling_state 컬럼에 SUSPENDED로, 일시 중단 사유는 CLONED_AUTO_SUSPENDED로 나타나요. 클론된 객체의 다운스트림 동적 테이블도 일시 중단되며 UPSTREAM_CLONED_AUTO_SUSPENDED로 표시돼요.

예약 갱신을 다시 시작하려면 각 클론된 동적 테이블에 대해 ALTER DYNAMIC TABLE <name> RESUME을 실행해요.

업스트림 동적 테이블을 다시 시작하면 UPSTREAM_CLONED_AUTO_SUSPENDED 상태의 다운스트림 동적 테이블도 자동으로 다시 시작돼요. 단, 다음 조건이 충족되어야 해요:

  • 다운스트림 동적 테이블이 클론 전에 수동으로 일시 중단되지 않았어야 해요. 수동으로 일시 중단됐다면 명시적으로 다시 시작해야 해요.
  • 다운스트림이 의존하는 모든 업스트림 동적 테이블이 다시 시작되어야 해요. 여러 업스트림 동적 테이블에 의존한다면 모두 다시 시작될 때까지 일시 중단 상태로 유지돼요.
  • 클론 전에 이미 일시 중단된 동적 테이블은 원래 일시 중단 사유를 유지하며 클론 작업의 영향을 받지 않아요.

초기 갱신은 재초기화될 수 있음

클론 후 초기 갱신은 증분 갱신이 아니라 전체 재초기화일 수 있어요. 클론의 변경 추적 상태가 기본 객체에서 분기되었으면 Snowflake가 전체 재초기화를 트리거해요.

기본 객체 없이 단일 동적 테이블을 클론하거나, 클론 후 클론 다시 시작을 늦추면 재초기화가 더 일어날 가능성이 있어요. 전체 스키마나 데이터베이스를 함께 클론하면 이 위험이 줄어요.

초기 갱신 시 전체 재초기화의 컴퓨팅 비용을 계획하세요. 자세한 내용은 재초기화 트리거 문서를 참조하세요.

이후 갱신은 동적 테이블의 REFRESH_MODE 설정에 따라 일반 갱신 모드(INCREMENTAL, FULL, ADAPTIVE, CUSTOM_INCREMENTAL)로 돌아가요.

제한 사항

  • 동적 Iceberg 테이블은 동적 Iceberg 테이블 또는 Snowflake 관리 Iceberg 테이블로만 클론할 수 있어요. 동적 Iceberg 테이블을 일반(비-Iceberg) 테이블로 클론할 수 없어요. 일반 동적 테이블을 클론하면 항상 일반 동적 테이블이 생성되며, 일반 동적 테이블을 Iceberg 형식으로 클론하는 구문은 없어요. 자세한 내용은 동적 Iceberg 테이블 클론 문서를 참조하세요.
  • 동적 Iceberg 테이블 클론에 스토리지 옵션을 설정할 수 없어요. 동적 Iceberg 테이블 클론은 소스와 같은 외부 볼륨과 카탈로그를 사용하며, Snowflake가 새 base location을 할당해요. 클론 문에서 EXTERNAL_VOLUME, CATALOG, BASE_LOCATION을 지정하면 오류가 반환돼요. 클론은 또한 소스의 Iceberg format version을 유지해요.
  • 지연(lag) 제약 위반이 클론 시점에 드러날 수 있어요. 다운스트림 동적 테이블이 생성된 후 업스트림 동적 테이블의 target lag가 변경된 경우, 지연 제약(다운스트림 지연은 가장 큰 업스트림 지연보다 크거나 같아야 함)은 클론 중에만 검증돼요. 제약이 충족되지 않으면 클론 명령이 실패해요. 이를 피하려면 클론 전에 target lag 제약을 확인하세요. 자세한 내용은 동적 테이블의 target lag 설정 문서를 참조하세요.
  • 클론 후 스토리지가 분기돼요. 클론 시점에 소스와 클론은 제로 복사 클로닝을 통해 기존 마이크로 파티션을 공유해요. 각 측이 갱신을 통해 수정되면 공유 스토리지가 분기되고 두 복사본 모두 독립적인 스토리지 비용이 발생해요.

다음 단계

  • 동적 테이블을 수동으로 일시 중단하거나 다시 시작하려면, 동적 테이블 관리 문서를 참조하세요.
  • 클론된 동적 테이블의 갱신 상태를 확인하려면, 동적 테이블 모니터링 문서를 참조하세요.
  • 클론된 동적 테이블을 계정 간에 공유하려면, 다른 계정과 동적 테이블 공유 문서를 참조하세요.
  • 동적 테이블 수정.

더 알아보기 (Learn more)