동적 테이블

동적 테이블은 선언적 데이터 변환 파이프라인의 기본 구성 요소입니다. 동적 테이블은 Snowflake의 데이터 엔지니어링을 크게 단순화해주고 데이터를 사용할 수 있도록 변환하는 안정적이고 비용 효율적이며 자동화된 방법을 제공합니다. 데이터 변환 단계를 일련의 작업으로 정의한 다음 종속성과 일정을 모니터링하는 대신, 단순히 동적 테이블을 사용하여 변환의 최종 상태를 정의하고 복잡한 파이프라인 관리를 Snowflake에 맡길 수 있습니다.

이 항목에서는 동적 테이블 개념과 동적 테이블을 사용하여 연속 데이터 파이프라인에서 데이터를 변환하는 방법을 소개합니다.

동적 테이블 은 지정하는 쿼리 결과를 구체화합니다. 별도의 대상 테이블을 생성하고 해당 테이블의 데이터를 변환 및 업데이트하는 코드를 작성하는 대신, 대상 테이블을 동적 테이블로 정의하고 변환을 수행하는 SQL 문을 지정할 수 있습니다. 자동화된 프로세스에서는 정기적인 새로 고침 을 통해 구체화된 결과를 자동으로 업데이트합니다.

동적 테이블의 내용은 전적으로 주어진 쿼리에 따라 결정되므로 DML을 사용하여 내용을 변경할 수 없습니다. 동적 테이블의 행을 삽입, 업데이트 또는 삭제하지 않습니다. 자동화된 새로 고침 프로세스는 쿼리 결과를 동적 테이블로 구체화합니다.

이에 관한 구체적인 내용은 이 항목의 뒷부분에서 자세히 알아보십시오.

다음 섹션에서는 동적 테이블 이면의 개념에 대해 설명합니다.

데이터가 랜딩 테이블(raw)로 스트리밍되므로 일정에 따라 로드된 JSON 데이터 변환하기 의 예에서는 스트림과 작업을 사용하여 새 데이터를 변환하여 두 개의 대상 테이블(namevisits)에 삽입합니다.

다음 예에서는 동적 테이블을 사용하여 동일한 변환을 수행하는 방법을 보여줍니다.

스트림과 작업에 대한 SQL 문

동적 테이블에 대한 SQL 문

-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a stream to capture inserts
-- to the landing table.
CREATE OR REPLACE STREAM rawstream1
  ON TABLE raw;

-- Create a table that stores the names
-- of office visitors from the raw data.
CREATE OR REPLACE TABLE names
  (id INT,
   first_name STRING,
   last_name STRING);

-- Create a task that inserts new name
-- records from the rawstream1 stream
-- into the names table.
-- Execute the task every minute when
-- the stream contains records.
CREATE OR REPLACE TASK raw_to_names
  WAREHOUSE = mywh
  SCHEDULE = '1 minute'
  WHEN
    SYSTEM$STREAM_HAS_DATA('rawstream1')
  AS
    MERGE INTO names n
      USING (
        SELECT var:id id, var:fname fname,
        var:lname lname FROM rawstream1
      ) r1 ON n.id = TO_NUMBER(r1.id)
      WHEN MATCHED AND metadata$action = 'DELETE' THEN
        DELETE
      WHEN MATCHED AND metadata$action = 'INSERT' THEN
        UPDATE SET n.first_name = r1.fname, n.last_name = r1.lname
      WHEN NOT MATCHED AND metadata$action = 'INSERT' THEN
        INSERT (id, first_name, last_name)
          VALUES (r1.id, r1.fname, r1.lname);
Copy
-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a dynamic table containing the
-- names of office visitors from
-- the raw data.
-- Try to keep the data up to date within
-- 1 minute of real time.
CREATE OR REPLACE DYNAMIC TABLE names
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  AS
    SELECT var:id::int id, var:fname::string first_name,
    var:lname::string last_name FROM raw;
Copy

이 예에서 보듯이, 동적 테이블을 생성할 때 보고 싶은 결과를 위한 쿼리를 지정합니다. 데이터의 증분 새로 고침의 경우, 변경 사항을 추적하는 스트림을 생성하고 이러한 변경 사항을 검사하고 변경 사항을 대상 테이블에 적용하는 작업을 작성할 필요가 없습니다. 자동화된 새로 고침 프로세스에서는 사용자가 지정하는 쿼리를 기반으로 이러한 작업을 자동으로 수행합니다.

동적 테이블을 사용하는 시점

파이프라인에서 데이터를 변환하는 방법은 여러 가지가 있습니다(예: 스트림 및 작업, CTAS, 자체적인 사용자 지정 솔루션). 동적 테이블은 데이터 변환을 위한 한 가지 옵션입니다.

동적 테이블은 다음과 같은 경우에 사용하기에 가장 적합합니다.

  • 데이터 종속성을 추적하고 데이터 새로 고침을 관리하는 코드를 작성하고 싶지 않은 경우.

  • 스트림과 작업의 복잡성이 필요하지 않거나 이런 상황을 방지하고 싶은 경우.

  • 여러 기본 테이블의 쿼리 결과를 구체화해야 할 경우.

  • ETL 파이프라인을 통해 데이터를 변환하려면 여러 테이블을 만들어야 합니다.

  • 세분화된 새로 고침 일정 제어가 필요하지 않으며 파이프라인의 대상 데이터 최신성을 지정하려는 것일 뿐입니다.

  • 저장 프로시저, 동적 테이블에서 지원되는 비결정적 함수 에 나열되지 않은 비결정적 함수 또는 외부 함수 와 같이 지원되지 않는 동적 쿼리 구성을 사용하거나 외부 테이블, 스트림 또는 구체화된 뷰인 동적 테이블에 대한 원본을 사용할 필요가 없습니다.

참고

동적 테이블을 스트림의 원본으로 사용할 수 있습니다. 함께 사용하면 동적 테이블을 기반으로 하는 스트림이 다른 스트림처럼 작동합니다. 추가 정보와 예는 스트림 및 동적 테이블 섹션을 참조하십시오.

동적 테이블의 작동 방식

동적 테이블을 생성할 때 하나 이상의 기본 테이블 오브젝트 또는 동적 테이블에서 데이터를 변환하는 데 사용하는 쿼리를 지정합니다. 자동화된 새로 고침 프로세스에서는 정기적으로 이 쿼리를 실행하고 기본 오브젝트에 대한 변경 사항으로 동적 테이블을 업데이트합니다.

Comparison between streams / tasks and dynamic tables

이 자동화된 프로세스에서는 기본 오브젝트에 대해 변경된 내용을 계산하고 이러한 변경 사항을 동적 테이블에 병합합니다. 이 프로세스는 동적 테이블과 연결하는 계산 리소스를 사용하여 이 작업을 수행합니다. 리소스에 대한 자세한 내용은 동적 테이블의 비용 이해하기 섹션을 참조하십시오.

동적 테이블을 생성할 때 데이터에 대한 목표 《최신성》을 지정합니다(목표 지연). 예를 들어, 데이터가 기본 테이블에 대한 업데이트보다 지연되는 시간을 최대 5분으로 제한해야 한다고 지정할 수 있습니다. 이 목표 최신성을 기반으로, 자동화된 프로세스는 동적 테이블의 데이터가 이 목표 내에서(예: 기본 테이블을 업데이트한 후 5분 이내) 최신 상태로 유지되도록 새로 고침을 설정합니다.

데이터가 최신 상태일 필요가 없는 경우 목표 최신성 시간을 더 길게 지정하여 비용을 절감할 수 있습니다. 예를 들어 대상 테이블의 데이터 최신성이 기본 테이블 업데이트보다 최대 1시간 이내로만 설정하면 될 경우에는 목표 최신성을 5분 대신 1시간으로 지정하여 비용을 절감할 수 있습니다.

동적 테이블의 파이프라인을 함께 연결하기 정보

다른 동적 테이블을 쿼리하도록 동적 테이블을 설정할 수 있습니다.

예를 들어 데이터 파이프라인이 스테이징 테이블에서 데이터를 검색하여 고객, 제품, 날짜 및 시간 데이터에 대해 별개의 차원 테이블 을 업데이트한다고 가정하겠습니다. 파이프라인이 차원 테이블을 기반으로 집계 판매 데이터가 포함된 테이블도 업데이트합니다.

차원 테이블을 스테이징 테이블을 쿼리하는 동적 테이블로 설정할 수 있습니다. 그러면 집계 판매 테이블을 차원 테이블을 쿼리하는 동적 테이블로 설정할 수 있습니다.

이는 작업의 DAG(방향성 비순환 그래프)를 정의하는 것과 유사합니다. 작업의 DAG에서 집계 판매 테이블을 업데이트하는 작업은 차원 테이블을 업데이트하는 작업이 완료 시점까지 오류 없이 실행된 경우에만 실행됩니다.

Comparison between DAGs for streams / tasks and dynamic tables

동적 테이블이 다른 동적 테이블을 쿼리하는 경우 자동화된 새로 고침 프로세스는 지연 목표가 충족되고 데이터가 일관성이 있도록 보장하기 위해 적절한 시간에 종속된 모든 동적 테이블을 업데이트합니다.

동적 테이블에 필요한 권한 이해하기

다음 섹션에서는 동적 테이블을 만들고 사용하는 데 필요한 권한을 설명합니다.

동적 테이블 권한

다음 표에는 동적 테이블 관리에 필요한 권한이 설명되어 있습니다.

권한

사용법

SELECT

동적 테이블에서 SELECT 문을 실행할 수 있습니다.

OPERATE

다음을 포함하여 동적 테이블의 속성을 변경하는 데 필요합니다.

OWNERSHIP

동적 테이블에 대한 모든 권한을 부여합니다. 특정 오브젝트에 대해 한 번에 단 하나의 역할만 이 권한을 보유할 수 있습니다.

ALL [ PRIVILEGES ]

OWNERSHIP을 제외하고 동적 테이블에 대한 모든 권한을 부여합니다.

동적 테이블과 Time Travel

Snowflake Time Travel을 사용하면 정의된 기간 내의 모든 시점에서 과거 데이터(즉, 변경 또는 삭제된 데이터)에 액세스할 수 있습니다. Time Travel은 기존 테이블의 경우와 마찬가지로 동적 테이블에서도 똑같이 동작합니다.

자세한 내용은 Snowflake Time Travel & Fail-safe 섹션을 참조하십시오.

동적 테이블 및 복제

동적 테이블에 대한 복제 지원을 사용하면 재해 복구 또는 데이터 공유를 위해 기본 데이터베이스에서 보조 데이터베이스로 데이터를 복사할 수 있습니다. 이는 재해 복구를 위한 장애 조치 준비 전략으로 사용되거나 읽기 전용 목적으로 배포 간에 데이터를 공유하는 수단으로 사용될 수 있습니다.

복제된 동적 테이블은 동적 테이블을 포함하는 기본 데이터베이스가 복제 그룹 또는 장애 조치 그룹에서 복제되는지에 따라 다르게 동작합니다. 자세한 내용은 복제 및 동적 테이블 섹션을 참조하십시오.