動的テーブルを作成する

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

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

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

変更の追跡を有効にする

Snowflakeは、動的テーブルが作成されると、基になるすべてのオブジェクトの変更追跡を自動的に有効にしようとします。基になるデータベースオブジェクトが変更されると、動的テーブルも変更されます。オブジェクトを再作成する場合は、変更追跡を再度有効にする必要があります。

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

特定のデータベースオブジェクトで変更追跡を有効にするには、そのオブジェクトで 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 関数を使用してリフレッシュ履歴をクエリできます。

ベーステーブルの列に対する変更の影響について

ベーステーブル、ビュー、および基になる動的テーブルの列は、時間の経過とともに変更される可能性があります。動的テーブル自体に影響を与える変更もあれば、影響が限定的かまったくない変更もあります。

動的テーブルに関連付けられた基になるオブジェクトが変更されると、以下の動作が適用されます。

変更

影響

  • 新しい列を追加する。

  • 既存の未使用の列を削除する。

なし。ベーステーブルに新しい列が追加されたり、未使用の列が削除されたりしても、何もアクションは発生せず、リフレッシュは以前と同様に継続されます。

  • 基になるベーステーブルが、同一の列名と型で再作成される。

  • 基になるベーステーブル列が、同一の名前と型で再作成される。

フルリフレッシュ/再初期化: 次のリフレッシュサイクルの間に、動的テーブルに不正確なデータや古いデータがないことを確実にするためにフルリフレッシュが実行されます。

  • 動的テーブルで使用される基になる列やその他の要素で、名前変更またはその他の方法による変更がある。

動的テーブルの状態は FAILING に変わります。変更に対応するために、動的テーブルを再作成する必要があります。動的なテーブルの状態に関する詳細については、 動的テーブルの状態 をご参照ください。