動的テーブル

動的テーブルは宣言型データ変換パイプラインの基礎的要素です。これらにより、Snowflakeでのデータエンジニアリングを大幅に簡素化し、信頼性が高く、コスト効率に優れた自動データ変換方法を消費用に提供します。データ変換ステップを一連のタスクとして定義し、依存関係とスケジューリングをモニターする代わりに、動的テーブルを使用して変換の最終状態を定義するだけで、複雑なパイプライン管理をSnowflakeに任せることができます。

このトピックでは、動的テーブルの概念と、動的テーブルを使用して連続データパイプラインでデータを変換する方法を紹介します。

動的テーブル は、指定したクエリの結果を具体化したテーブルです。ターゲットテーブルを別に作成し、そのテーブルのデータを変換および更新するコードを記述するのではなく、ターゲットテーブルを動的テーブルとして定義し、変換を実行する SQL ステートメントを指定することができます。自動プロセスでは、定期的な(多くの場合、 増分)リフレッシュによって、具体化された結果が自動的にリフレッシュされます。動的テーブルリフレッシュの詳細については、 動的テーブルリフレッシュについて をご参照ください。

動的テーブルのコンテンツは特定のクエリによって決定されるため、 DML を使用してコンテンツを変更することはできません。動的テーブルの行を挿入、更新、削除することはありません。自動リフレッシュプロセスは、クエリ結果を動的テーブルに具体化します。

次のセクションでは、動的テーブルの概念について説明します。

注釈

動的テーブルを含むデータベースの複製はサポートされていません。データベースに動的テーブルが含まれている場合は、そのデータベースの複製に失敗します。この制限を回避するには、データベースを複製する前に、データベース内にある 動的テーブルをすべてドロップ する必要があります。

簡単な例

ロードされた JSON データのスケジュールに従った変換 の例では、ストリームとタスクを使用して、2つのターゲットテーブル(name および visits)に新しいデータを変換して挿入し、データをランディングテーブル(raw)にストリームしています。

次のテーブルは、動的テーブルを使用して同じ変換を実行する方法を示しています。

ストリームおよびタスクの 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、独自のカスタムソリューション)動的テーブルは、データの変換メソッドとして考えられる方法の1つです。

動的テーブルは、以下のような場合に最適です。

  • データの依存関係を追跡してデータのリフレッシュを管理するコードの記述を望まない。

  • ストリームやタスクの複雑さは必要ない、または避けたい。

  • 粒度の細かいリフレッシュスケジュールのコントロールは必要ない。

  • 複数のベーステーブルのクエリ結果を具体化する必要があります。

  • ストアドプロシージャ動的テーブルでサポートされる非決定性関数 にリスト されていない 非決定性関数、または 外部関数 など、サポートされていない動的クエリ構造を使用する必要がない。

注釈

動的テーブルはストリームで使用できます。動的テーブルに基づくストリームは、併用すると他のストリームと同様に機能します。その他の情報と例については、 ストリームおよび動的テーブル をご参照ください。

動的テーブルの仕組み

動的テーブルを作成する場合は、1つ以上のベーステーブルまたは動的テーブルからデータを変換するために使用するクエリを指定します。自動リフレッシュプロセスは、このクエリを定期的に実行し、ベーステーブルに加えられた変更を使用して動的テーブルをリフレッシュします。

Comparison between streams / tasks and dynamic tables

この自動プロセスは、ベーステーブルに加えられた変更を計算し、その変更を動的テーブルにマージします。この作業を実行するために、プロセスは、動的テーブルに関連付けられたウェアハウス内のコンピューティングリソースを使用します。

動的テーブルの作成時に、データのターゲット「鮮度」を指定します(ターゲット ラグ)。たとえば、ベーステーブルのリフレッシュから最大5分遅れてデータをリフレッシュするように指定できます。自動プロセスは、このターゲット鮮度に基づいて、動的テーブルのデータがこのターゲット内(例: ベーステーブルのリフレッシュから5分以内)にリフレッシュされるようにリフレッシュを設定します。

データの鮮度がそれほど重要ではない場合は、ターゲット鮮度時間を長く指定してコストを削減することができます。たとえば、ターゲットテーブルのデータがベーステーブルの更新から最大1時間遅れていればよい場合は、1時間(5分ではなく)のターゲット鮮度を指定してコストを削減できます。

動的テーブルのパイプラインのチェーン

動的テーブルを設定して、他の動的テーブルをクエリできます。

たとえば、データパイプラインがステージングテーブルからデータを取得し、顧客、製品、および日時のデータについて、 ディメンジョンテーブル を更新するとします。データパイプラインは、ディメンジョンテーブルに基づいて、集計した販売データを含むテーブルも更新するとします。

ディメンジョンテーブルは、ステージングテーブルにクエリする動的テーブルとして設定できます。次に、ディメンジョンテーブルにクエリを発行する動的テーブルとして、売上集計テーブルを設定できます。

これはタスクの有向非巡回グラフ(DAG)を定義する方法と似ています。タスクの DAG では、売上集計テーブルを更新するタスクは、ディメンジョンテーブルを更新するタスクがエラーなしで完了した場合にのみ実行されます。

Comparison between DAGs for streams / tasks and dynamic tables

動的テーブルが別の動的テーブルをクエリする場合、自動リフレッシュプロセスは、それぞれのラグターゲットが満たされ、データが一貫していることを保証するために、適切なタイミングで依存するすべての動的テーブルをリフレッシュします。

動的テーブルに必要な権限について

次のセクションでは、動的テーブルの作成と操作に必要な権限について説明します。

動的テーブルの権限

次のテーブルでは、動的テーブルの管理に必要な権限について説明します。

権限

使用状況

SELECT

動的テーブルで SELECT ステートメントを実行できるようにします。

MONITOR

動的テーブルの詳細表示(DESCRIBE DYNAMIC TABLE または Snowsight の動的テーブル詳細ページを使用)と、アクセス権が付与されたリストテーブル(SHOW DYNAMIC TABLES を使用)をできるようにします。

OPERATE

動的テーブルの詳細を表示し(DESCRIBE DYNAMIC TABLE を使用)、プロパティ WAREHOUSE および TARGET_LAG を変更できるようにします。

OWNERSHIP

動的テーブルに対する包括的な制御を付与します。動的テーブルのプロパティを変更するために必要です。特定のオブジェクトに対して一度にこの権限を保持できるのは、1つのロールのみです。

ALL [ PRIVILEGES ]

動的テーブルに対する OWNERSHIP を除くすべての権限を付与します。