동적 테이블

동적 테이블은 선언적 데이터 변환 파이프라인의 기본 구성 요소입니다. 동적 테이블은 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, 자체적인 사용자 지정 솔루션 등). 동적 테이블은 한 가지 가능한 데이터 변환 방법입니다.

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

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

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

  • 세분화된 새로 고침 일정 관리가 필요하지 않은 경우.

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

  • 저장 프로시저, 동적 테이블에서 지원되는 비결정적 함수 에 나열되지 않은 비결정적 함수 또는 외부 함수 와 같이 지원되지 않는 동적 쿼리 구성을 사용할 필요가 없는 경우.

참고

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

동적 테이블의 작동 방식

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

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 문을 실행할 수 있습니다.

MONITOR

동적 테이블에 대한 세부 정보(Snowsight 에서 DESCRIBE DYNAMIC TABLE 또는 동적 테이블 세부 정보 페이지 사용)와 액세스 권한이 부여된 목록 테이블(SHOW DYNAMIC TABLES 사용)을 볼 수 있습니다.

OPERATE

동적 테이블의 세부 정보를 보고(DESCRIBE DYNAMIC TABLE 사용) WAREHOUSE 및 TARGET_LAG 속성을 변경할 수 있습니다.

OWNERSHIP

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

ALL [ PRIVILEGES ]

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