動的なテーブルの初期化とリフレッシュの理解

動的テーブルのコンテンツはクエリによって定義され、基になるデータが変更されると自動的に更新 (リフレッシュ) されます。このプロセスはクエリを分析し、テーブルを最新の状態に保ちます。

以下のセクションでは、動的テーブルリフレッシュについて詳しく説明します。

セクション

説明

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

初期化、つまり動的テーブルを作成する際の初期データの投入を紹介します。初期リフレッシュのタイミングを指定できます。

手動およびスケジュール更新オプションの理解

動的テーブルリフレッシュの概要。動的テーブルは、手動で更新しない限り、スケジュールに従って更新されます。

動的テーブルのリフレッシュモード

動的テーブルは、インクリメンタル、フル、およびAUTOの異なるリフレッシュモードをサポートしています。

動的テーブルが他の動的テーブルに依存する場合のデータの更新方法

動的テーブルが依存関係に関連してどのようにリフレッシュされるかを学びます。

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

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

動的テーブルを作成した 場合、最初のリフレッシュは作成時に同期的に行われるか、スケジュールされた時刻に行われます。初期データ入力、つまり 初期化 は、この初期リフレッシュがいつ発生するかによって決まります。

動的テーブルは、指定された ターゲット・ラグ に基づいて更新されます。これは、ベーステーブルの更新と動的テーブルのコンテンツとの間に許容される最大遅延をセットします。INITIALIZE = ON_CREATE (デフォルト) をセットすると、テーブルはすぐに初期化されます。INITIALIZE = ON_SCHEDULE をセットした場合、初期化は指定したターゲットラグタイムフレーム内で行われます。

例えば、ターゲット・ラグが30分の動的テーブル、 DT1 を考えてみましょう。DT1 の初期データ入力は次のようになります。

  • DT1 が作成時に同期的にリフレッシュするようにセットされている場合 (ON_CREATE)、作成時に初期化されます。

  • DT1 がスケジュール時間 (ON_SCHEDULE) にリフレッシュするようにセットされている場合、30分以内に初期化されます。

下流に依存関係があるシナリオでは、リフレッシュの動作は依存関係に依存します。たとえば、動的テーブル DT1ダウンストリーム のターゲット・ラグがあり、 DT1 に依存する DT2 に30分のターゲット・ラグがある場合、 DT2 がリフレッシュされたときにのみ、 DT1 がリフレッシュされます。

DT1 の場合:

  • 作成時に同期的に更新するようにセットすると、すぐに初期化されます。初期化に失敗した場合は、作成プロセスが停止し、エラーに関するフィードバックが即座に提供されます。

  • スケジュールされた時間にリフレッシュするようにセットされている場合、初期化は DT2 がリフレッシュする時間に依存します。

スキャンされるデータの量に応じて、初期化に時間がかかる場合があります。進捗状況については、 動的テーブル作成のトラブルシューティング を参照してください。

手動およびスケジュール更新オプションの理解

動的テーブルは、 ターゲットラグ によって決定されるスケジュールでリフレッシュされます。動的テーブルが読み込まれるたびに、データの鮮度はターゲット・ラグで定義された期間内になります。

ALTER DYNAMIC TABLE ... REFRESH コマンドまたは Snowsight ... を使用して、動的テーブルを手動でリフレッシュし、最新のデータを取得することができます。詳細については、 動的テーブルの手動更新 をご参照ください。

動的テーブル更新のタイムアウトは、 STATEMENT_TIMEOUT_IN_SECONDS パラメーターによって制御されます。このパラメーターは、アカウントまたはウェアハウスレベルで、更新が自動的にキャンセルされるまでの最大許容期間をセットします。

ターゲットのタイムラグがスケジュール更新に与える影響

ターゲットラグは、スケジュール更新の頻度を制御します。リフレッシュを手動で管理するには、動的テーブルのターゲット・ラグを DOWNSTREAM に設定し、下流のすべての動的テーブルも DOWNSTREAM に設定されていることを確認します。

Directed Acyclic Graph (DAG) 全体のターゲット・ラグを DOWNSTREAM にセットすると、最終的な動的テーブルがリフレッシュ・スケジュールを制御するため、スケジュールされたリフレッシュは実質的に無効になります。時間ベースのターゲット・ラグを持つ動的テーブルがない場合、パイプラインはスケジュール更新のために中断されます。この場合、最も下流のテーブルを手動で更新すると、上流の依存関係も自動的に更新されます。

ターゲットラグを DOWNSTREAM にセットしても、正確な時間は指定されません。その代わりに、Snowflakeはリフレッシュ・ケイデンスを選択し、ラグをターゲット値以下に抑えようとします。たとえば、ターゲット・ラグが4時間の動的テーブルは、3.5時間ごとにリフレッシュされます。

正確な時間を指定するには、 CRON スケジュール付きタスクを使用します。詳細は 動的テーブルの手動更新 を参照してください。

動的テーブルのリフレッシュモード

動的テーブルは、自動、インクリメンタル、フルの3つのリフレッシュモードをサポートしています。リフレッシュモードを AUTO または明示的に設定できます。

  • AUTO リフレッシュモード: AUTO パラメーターの使用時、Snowflakeは、クエリの複雑さ、サポートされる構築、演算子、関数、および予想されるパフォーマンスに基づいて、コストと時間効果が最も高いリフレッシュモードを自動的に選択します。この決定は、テーブルの作成時に一度だけ行われます。インクリメンタルリフレッシュが サポート対象外 または 非効率 の場合、Snowflakeは代わりにフルリフレッシュを選択します。

    たとえば、動的テーブルがビューを参照し、ビューの定義が非同期に変更された場合でも、リフレッシュモードは変更なしのままになります。元の決定は増分であったが、サポートされなくなった場合(たとえば、上流のビューの変更が原因で)、リフレッシュは Dynamic table can no longer be refreshed incrementally because an upstream view changed. のようなエラーで失敗します。

    リフレッシュモードを変更するには、CREATE OR REPLACE DYNAMIC TABLE コマンドを使用して動的テーブルを再作成します。

  • インクリメンタル・リフレッシュ・モード: このモードでは、動的テーブルのクエリを分析し、前回のリフレッシュからの変更点を計算します。そして、これらの変更をテーブルにマージします。

  • フル・リフレッシュ・モード: このモードでは、動的テーブルのクエリを実行し、以前にマテリアライズされた結果を完全に置き換えます。

フルリフレッシュとインクリメンタルリフレッシュを使用する場合のガイダンスについては、 リフレッシュモードを選択 をご参照ください。既存の動的テーブルがどのリフレッシュモードを使用しているかを確認するには、 リフレッシュモード をご参照ください。

重要

増分リフレッシュ・モードの動的テーブルは、完全リフレッシュ・モードの動的テーブルからダウンストリームできません。これは、インクリメンタルリフレッシュモードが、上流のフルリフレッシュテーブルの各リフレッシュ時に発生する完全な行の変更と互換性がないためです。

動的テーブルが他の動的テーブルに依存する場合のデータの更新方法

動的テーブルのラグが時間指標としてセットされている場合、自動リフレッシュ・プロセスは、ターゲット・ラグ時間を満たすようにリフレッシュをスケジュールします。

ある動的テーブルが別の動的テーブルに依存 している場合にデータの一貫性を保つために、このプロセスはアカウント内のすべての動的テーブルを互換性のあるタイミングでリフレッシュします。リフレッシュの頻度が低いタイミングは、リフレッシュの頻度が高いタイミングと一致します。リフレッシュに時間がかかりすぎる場合、スケジューラーはリフレッシュをスキップして最新の状態に保とうとするかもしれません。ただし、スナップショットの分離は維持されます。

例えば、動的テーブル DT1 のターゲット・ラグは2分で、動的テーブル DT2 、ターゲット・ラグは1分であるとします。このプロセスでは、 DT1 は96秒ごとに、 DT2 は48秒ごとにリフレッシュされるべきだと判断されるかもしれません。その結果、このプロセスは以下のスケジュールを適用する可能性があります。

特定の時点

リフレッシュされる動的テーブル

2022-12-01 00:00:00

DT1, DT2

2022-12-01 00:00:48

DT2

2022-12-01 00:01:36

DT1, DT2

2022-12-01 00:02:24

DT2

動的テーブルのターゲットラグは、それが依存する動的テーブルのターゲットラグよりも短くはできません。たとえば、次の場合を考慮します。

  • DT1 は動的テーブル DT2 および DT3 をクエリします。

  • DT2 のターゲット・ラグは5分。

  • DT3 のターゲット・ラグは1分。

つまり、 DT1 のターゲット・ラグタイムは5分より短くてはなりません(つまり、 DT2DT3 のラグタイムの長い方より短くてはなりません)。

DT1 のラグを5分にセットすると、このプロセスでは、これらの目標でリフレッシュスケジュールが設定されます。

  • DT3 をタイムラグが1分未満になるように十分な頻度で更新してください。

  • DT1DT2 を一緒にリフレッシュし、タイムラグが5分以内になるように十分な頻度でリフレッシュしてください。

  • スナップショットの分離を確実にするため、 DT1DT2 のリフレッシュが DT3 のリフレッシュと一致するようにしてください。

重要

増分リフレッシュ・モードの動的テーブルは、完全リフレッシュ・モードの動的テーブルからダウンストリームできません。これは、インクリメンタルリフレッシュモードが、上流のフルリフレッシュテーブルの各リフレッシュ時に発生する完全な行の変更と互換性がないためです。

スナップショットの分離

動的テーブルがリフレッシュされると、すべての上流の依存関係で同じデータのタイムスタンプへのTime Travelで一貫した状態が保証されます。

非動的ベーステーブルの場合、Time Travelは通常どおり機能し、「ウォールクロック」のコミット時間を参照します。これは、動的テーブルのコンテンツが常にベーステーブルのデータの「スナップショット」と一致していることを意味します。

上流の動的テーブルの場合、Snowflakeはそのデータタイムスタンプでタグ付けされた特定のテーブルバージョンを検索します。これにより、下流のテーブルは常にその祖先との整合性が保たれます。リフレッシュのスケジュールを調整したり、異なるラグを心配したりする必要はありません。Snowflakeは、パイプライン全体でデータの整合性を確保するために、スナップショットを自動的に調整します。

アドホッククエリが各テーブルの現在のバージョンを使用するため、手動SELECTステートメントを使用して複数の動的テーブルを結合する場合、スナップショットの分離は保証されません。各動的テーブルは独立してリフレッシュをコミットするため、動的テーブルが同じターゲットラグを共有していたり、上流のリフレッシュが遅れていても、手動結合は異なるリフレッシュ状態をキャプチャする可能性があります。これは、結果がベースデータの単一の一貫性のあるスナップショットを反映していない可能性があることを意味します。

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

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

変更

影響

  • ベーステーブルに新しい列を追加。

  • ベーステーブルの既存の未使用列を削除。

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

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

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

  • 増分リフレッシュを使用した動的テーブルの基になるベーステーブルのポリシーの変更。

再初期化: 再作成後の最初のリフレッシュは 初期化 です。

  • ベーステーブルからの SELECT * で作成された動的テーブルの基になるベーステーブルの変更。

動的テーブルはリフレッシュできず、変更に対応するために再作成する必要があります。

  • 列定義で作成された動的テーブルの基になるベーステーブルの変更。

動的テーブルへの影響はありません。