動的テーブルを作成する

このトピックでは、動的テーブルを作成するための主な概念と、初期化プロセスで発生する内容について説明します。

開始する前に、 動的テーブルを作成するための権限 があり、動的テーブルクエリで使用されるすべてのオブジェクトで 変更追跡 が有効になっていることを確認してください。

動的テーブルの作成にはいくつかの制限があります。包括的なリストについては、 動的テーブルの既知の制限 をご参照ください。

変更の追跡を有効にする

増分リフレッシュモードで動的テーブルを作成する際、クエリするテーブルで変更追跡が有効になっていない場合、Snowflakeは自動的にそれらのテーブルで変更追跡を有効にしようとします。増分リフレッシュをサポートするには、動的テーブルで使用されるすべての基本オブジェクトに対して、 ゼロ以外のTime Travel保持期間 で変更追跡を有効にする必要があります。基になるデータベースオブジェクトが変更されると、動的テーブルも変更されます。オブジェクトを再作成する場合は、変更追跡を再度有効にする必要があります。

注釈

Snowflakeは、フルリフレッシュモードで作成された動的テーブルの変更追跡を自動的に有効化しようとしません。

特定のデータベースオブジェクトで変更追跡を有効にするには、そのオブジェクトで ALTER TABLEALTER VIEW などのコマンドを使用します。動的テーブルを作成するユーザーには、基になるすべてのオブジェクトの変更追跡を有効化する OWNERSHIP 権限が必要です。変更追跡が有効かどうかを確認するには、基になるオブジェクトに対して SHOW VIEWSSHOW TABLES などのコマンドを使用し、 change_tracking 列を調べます。

動的テーブルを作成するための構文

staging_table という名前のテーブルから、 product_idproduct_name の列を含む product という名前の動的テーブルを作成し、次を決定するとします。

  • product テーブル内のデータは、 staging_table 内のデータより最大で20分の遅延に設定します。

  • リフレッシュ に必要なコンピューティングリソースには、ウェアハウス mywh を使用します。

  • リフレッシュモードが自動的に選択されるようにします。

  • 動的テーブルを作成時に同期的にリフレッシュしたいと思っています。

  • リフレッシュタイプが自動的に選択され、動的テーブルが作成時に同期的にリフレッシュされるようにします。

この動的テーブルを作成するには、次の CREATE DYNAMIC TABLE SQL ステートメントを実行します。

CREATE OR REPLACE DYNAMIC TABLE product
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  REFRESH_MODE = auto
  INITIALIZE = on_create
  AS
    SELECT product_id, product_name FROM staging_table;
Copy

パラメーターの完全なリストとバリアント構文については、 CREATE DYNAMIC TABLE リファレンスをご参照ください。

動的テーブル初期化の理解

CREATE DYNAMIC TABLE ステートメントを使用して動的テーブルを作成すると、初期リフレッシュははスケジュールされた時間に実行されるか、作成時に同期的に実行されます。初期データ入力、つまり 初期化 は、この初期リフレッシュがいつ発生するかによって決まります。

動的テーブルは、指定された ターゲットラグ に基づいてリフレッシュされます。これにより、動的テーブルのコンテンツがベーステーブルのリフレッシュから遅れる最大許容時間が設定されます。作成時に同期的にリフレッシュするように動的テーブルを指定した場合、すぐに初期化されます。ただし、動的テーブルがスケジュールされた時間にリフレッシュされるように設定されている場合、ターゲットラグに指定された時間内に初期化されます。

たとえば、 DT1 という動的テーブルがあり、30分のタイムラグがあるとします。DT1 の初期データ入力は次のようになります。

  1. 作成時に同期的にリフレッシュするように DT1 が設定されている場合(デフォルト)、作成時に初期化されます。

  2. スケジュールされた時間にリフレッシュするように DT1 設定されている場合、ターゲットラグに指定された時間内に初期化されます。

下流の依存関係が関係するシナリオでは、ダイナミクスが変化します。動的テーブル DT1 とD2について考えてみましょう。ここで、 DT1 は ダウンストリーム のターゲットラグを持ち、 DT2 は30分のターゲットラグを持ち、 DT1 に依存しています。DT1 は、下流のターゲットラグにより​​、 DT2 などの依存する動的テーブルがリフレッシュされる場合にのみリフレッシュされます。

このコンテキストにおける DT1 について:

  1. 作成時に同期的にリフレッシュするように設定されている場合、作成時にリフレッシュおよび初期化されます。初期化に失敗した場合、テーブル作成プロセスは停止し、誤った定義に関するフィードバックが即座に提供されます。

  2. スケジュールされた時刻にリフレッシュするように設定されている場合、初期化は依存テーブルである DT2 がいつリフレッシュされるかに応じて異なります。

スキャンされるデータの量に応じて、初期化に時間がかかる場合があります。進捗状況を確認するには、 DYNAMIC_TABLE_REFRESH_HISTORY 関数を使用してリフレッシュ履歴をクエリできます。