動的テーブルを作成する¶
このトピックでは、動的テーブルを作成するための主な概念と、初期化プロセスで発生する内容について説明します。
開始する前に、 動的テーブルを作成するための権限 があり、動的テーブルクエリで使用されるすべてのオブジェクトで 変更追跡 が有効になっていることを確認してください。
動的テーブルの作成にはいくつかの制限があります。包括的なリストについては、 動的テーブルの既知の制限 をご参照ください。
変更の追跡を有効にする¶
増分リフレッシュモードで動的テーブルを作成する際、クエリするテーブルで変更追跡が有効になっていない場合、Snowflakeは自動的にそれらのテーブルで変更追跡を有効にしようとします。増分リフレッシュをサポートするには、動的テーブルで使用されるすべての基本オブジェクトに対して、 ゼロ以外のTime Travel保持期間 で変更追跡を有効にする必要があります。基になるデータベースオブジェクトが変更されると、動的テーブルも変更されます。オブジェクトを再作成する場合は、変更追跡を再度有効にする必要があります。
注釈
Snowflakeは、フルリフレッシュモードで作成された動的テーブルの変更追跡を自動的に有効化しようとしません。
特定のデータベースオブジェクトで変更追跡を有効にするには、そのオブジェクトで ALTER TABLE や ALTER VIEW などのコマンドを使用します。動的テーブルを作成するユーザーには、基になるすべてのオブジェクトの変更追跡を有効化する OWNERSHIP 権限が必要です。変更追跡が有効かどうかを確認するには、基になるオブジェクトに対して SHOW VIEWS、 SHOW TABLES などのコマンドを使用し、 change_tracking
列を調べます。
動的テーブルを作成するための構文¶
staging_table
という名前のテーブルから、 product_id
と product_name
の列を含む product
という名前の動的テーブルを作成し、次を決定するとします。
product
テーブル内のデータは、staging_table
内のデータより最大で20分の遅延に設定します。リフレッシュ に必要なコンピューティングリソースには、ウェアハウス
mywh
を使用します。リフレッシュモードが自動的に選択されるようにします。
Snowflakeでは、開発中のみ自動リフレッシュモードを使用することを推奨しています。詳細については、 すべての実稼働動的テーブルのリフレッシュモードを設定します。 をご参照ください。
動的テーブルを作成時に同期的にリフレッシュしたいと思っています。
リフレッシュタイプが自動的に選択され、動的テーブルが作成時に同期的にリフレッシュされるようにします。
この動的テーブルを作成するには、次の 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;
パラメーターの完全なリストとバリアント構文については、 CREATE DYNAMIC TABLE リファレンスをご参照ください。
動的テーブル初期化の理解¶
CREATE DYNAMIC TABLE ステートメントを使用して動的テーブルを作成すると、初期リフレッシュははスケジュールされた時間に実行されるか、作成時に同期的に実行されます。初期データ入力、つまり 初期化 は、この初期リフレッシュがいつ発生するかによって決まります。
動的テーブルは、指定された ターゲットラグ に基づいてリフレッシュされます。これにより、動的テーブルのコンテンツがベーステーブルのリフレッシュから遅れる最大許容時間が設定されます。作成時に同期的にリフレッシュするように動的テーブルを指定した場合、すぐに初期化されます。ただし、動的テーブルがスケジュールされた時間にリフレッシュされるように設定されている場合、ターゲットラグに指定された時間内に初期化されます。
たとえば、 DT1 という動的テーブルがあり、30分のタイムラグがあるとします。DT1 の初期データ入力は次のようになります。
作成時に同期的にリフレッシュするように DT1 が設定されている場合(デフォルト)、作成時に初期化されます。
スケジュールされた時間にリフレッシュするように DT1 設定されている場合、ターゲットラグに指定された時間内に初期化されます。
下流の依存関係が関係するシナリオでは、ダイナミクスが変化します。動的テーブル DT1 とD2について考えてみましょう。ここで、 DT1 は ダウンストリーム のターゲットラグを持ち、 DT2 は30分のターゲットラグを持ち、 DT1 に依存しています。DT1 は、下流のターゲットラグにより、 DT2 などの依存する動的テーブルがリフレッシュされる場合にのみリフレッシュされます。
このコンテキストにおける DT1 について:
作成時に同期的にリフレッシュするように設定されている場合、作成時にリフレッシュおよび初期化されます。初期化に失敗した場合、テーブル作成プロセスは停止し、誤った定義に関するフィードバックが即座に提供されます。
スケジュールされた時刻にリフレッシュするように設定されている場合、初期化は依存テーブルである DT2 がいつリフレッシュされるかに応じて異なります。
スキャンされるデータの量に応じて、初期化に時間がかかる場合があります。進捗状況を確認するには、 DYNAMIC_TABLE_REFRESH_HISTORY 関数を使用してリフレッシュ履歴をクエリできます。