動的なテーブルの初期化とリフレッシュの理解¶
動的テーブルのコンテンツはクエリによって定義され、基になるデータが変更されると自動的に更新 (リフレッシュ) されます。このプロセスはクエリを分析し、テーブルを最新の状態に保ちます。
以下のセクションでは、動的テーブルリフレッシュについて詳しく説明します。
セクション |
説明 |
---|---|
初期化、つまり動的テーブルを作成する際の初期データの投入を紹介します。初期リフレッシュのタイミングを指定できます。 |
|
動的テーブルリフレッシュの概要。動的テーブルは、手動で更新しない限り、スケジュールに従って更新されます。 |
|
動的テーブルは、インクリメンタルとフルという2つのリフレッシュ・モードをサポートしています。リフレッシュモードは 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 スケジュールを持つタスクを使用することができます。例:
CREATE TASK my_task
SCHEDULE = 'USING CRON <expr> <time_zone>'
AS
ALTER DYNAMIC TABLE my_dynamic_table REFRESH;
動的テーブルのリフレッシュモード¶
動的テーブルは、インクリメンタルとフルという2つのリフレッシュ・モードをサポートしています。リフレッシュモードは AUTO 、または明示的にセットすることができます。
AUTO リフレッシュ・モード:
AUTO
パラメーターを使用すると、Snowflake はクエリの複雑さ、サポートされる構造、演算子、関数、および期待されるパフォーマンスに基づいて、最もコストと時間の効率に優れたリフレッシュモードを自動的に選択します。インクリメンタルリフレッシュがサポートされていない場合、またはパフォーマンスが低下する可能性がある場合、Snowflakeは自動的にフルリフレッシュを選択します。インクリメンタル・リフレッシュ・モード: このモードでは、動的テーブルのクエリを分析し、前回のリフレッシュからの変更点を計算します。そして、これらの変更をテーブルにマージします。
フル・リフレッシュ・モード: このモードでは、動的テーブルのクエリを実行し、以前にマテリアライズされた結果を完全に置き換えます。
動的テーブルを作成した後、テーブルをモニターして、 そのテーブルのリフレッシュに増分リフレッシュまたはフルリフレッシュが使用されているかどうかを判断することができます。
動的なテーブル更新モードを選択するためのベストプラクティス¶
動的テーブルのパフォーマンスに最適なモードは、データ変更量とクエリの複雑さによって異なります。さらに、専用のウェアハウスでさまざまなリフレッシュモードをテストすることで、コストを分離し、実際のワークロードに基づいてパフォーマンスチューニングを改善することができます。
AUTO リフレッシュモード: システムはデフォルトでインクリメンタルリフレッシュを適用しようとします。 インクリメンタルリフレッシュがサポートされていない場合 、あるいはうまく機能しない可能性がある場合、動的テーブルは自動的にフルリフレッシュを選択します。
手動でチューニングしなくてもSnowflakeがリフレッシュ動作を最適化できるため、ほとんどの使用ケースでは
AUTO
の使用を強くお勧めします。一貫した動作を実現するために、すべてのプロダクションテーブルで明示的にリフレッシュモードをセットしてください。、Snowflakeリリース間でAUTO
動作が変更される可能性があり、プロダクションパイプラインで使用した場合、パフォーマンスに予期せぬ変化が生じる可能性があります。
インクリメンタルリフレッシュ: 最後の更新以降の変更のみで動的テーブルを更新するため、頻繁に小さな更新が行われる大規模なデータセットに最適です。
インクリメンタルリフレッシュに対応したクエリに最適です(例えば、決定性関数、単純な結合、
SELECT
、WHERE
、GROUPBY
の基本式など)。サポートされていない機能が存在し、更新モードがインクリメンタルに設定されている場合、Snowflakeは動的テーブルの作成に失敗します。インクリメンタルリフレッシュでパフォーマンスを最適化するための重要なプラクティスは、変更量をソースデータの5%程度に抑え、グループ化キーでデータをクラスタリングして処理のオーバーヘッドを減らすことです。
多くの結合を行う集約のような、特定の操作の組み合わせは、効率的に実行されない可能性があります。
フルリフレッシュ: データセット全体を再処理し、完全なクエリ結果で動的テーブルを更新します。複雑なクエリや、大幅なデータ変更で完全な更新が必要な場合に使用します。
複雑なクエリ、非決定性関数、データの大きな変更などにより、インクリメンタルリフレッシュがサポートされていない場合に便利です。
あなたのユースケースに最適なモードを決定するために、自動推奨と具体的なリフレッシュモード(フルとインクリメンタル)を試してみてください。
重要
増分リフレッシュ・モードの動的テーブルは、完全リフレッシュ・モードの動的テーブルからダウンストリームできません。これは、インクリメンタルリフレッシュモードが、上流のフルリフレッシュテーブルの各リフレッシュ時に発生する完全な行の変更と互換性がないためです。
動的テーブルのリフレッシュモードを確認するには、 動的テーブルリフレッシュモードを表示する をご参照ください。
動的テーブルリフレッシュモードを表示する¶
動的テーブルを作成する 際に、 リフレッシュ・モード をセットします。作成後、 必要な権限を持つロール を使用して、以下の方法のいずれかを使用して、動的テーブルがインクリメンタルリフレッシュを使用するかフルリフレッシュを使用するかを確認できます。
SHOW DYNAMIC TABLES コマンドを実行します。
SHOW DYNAMIC TABLES;
出力 で:
text
列はユーザー指定のリフレッシュモードを示します。refresh_mode
列は実際のリフレッシュモードを示します。refresh_mode_reason
は、実際のリフレッシュモードが選択された理由を示しています。
ナビゲーションメニューで、 Monitoring » Dynamic Tables を選択し、動的テーブルを選択します。
動的テーブルのリフレッシュ・モードは、ページ上部のオブジェクト・ヘッダーで表示できます。フルリフレッシュの場合、モードの上にマウスを置くと、リフレッシュモードの理由が表示されます。
動的テーブルが他の動的テーブルに依存する場合のデータの更新方法¶
動的テーブルのラグが時間指標としてセットされている場合、自動リフレッシュ・プロセスは、ターゲット・ラグ時間を満たすようにリフレッシュをスケジュールします。
ある動的テーブルが別の動的テーブルに依存 している場合にデータの一貫性を保つために、このプロセスはアカウント内のすべての動的テーブルを互換性のあるタイミングでリフレッシュします。リフレッシュの頻度が低いタイミングは、リフレッシュの頻度が高いタイミングと一致します。リフレッシュに時間がかかりすぎる場合、スケジューラーはリフレッシュをスキップして最新の状態に保とうとするかもしれません。ただし、スナップショットの分離は維持されます。
例えば、動的テーブル 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分より短くてはなりません(つまり、 DT2
と DT3
のラグタイムの長い方より短くてはなりません)。
DT1
のラグを5分にセットすると、このプロセスでは、これらの目標でリフレッシュスケジュールが設定されます。
DT3
をタイムラグが1分未満になるように十分な頻度で更新してください。DT1
、DT2
を一緒にリフレッシュし、タイムラグが5分以内になるように十分な頻度でリフレッシュしてください。スナップショットの分離を確実にするため、
DT1
とDT2
のリフレッシュがDT3
のリフレッシュと一致するようにしてください。
重要
増分リフレッシュ・モードの動的テーブルは、完全リフレッシュ・モードの動的テーブルからダウンストリームできません。これは、インクリメンタルリフレッシュモードが、上流のフルリフレッシュテーブルの各リフレッシュ時に発生する完全な行の変更と互換性がないためです。
ベーステーブルの列に対する変更の影響について¶
動的テーブルに関連付けられた基になるオブジェクトが変更されると、以下の動作が適用されます。
変更 |
影響 |
---|---|
|
なし。ベーステーブルに新しい列が追加されたり、未使用の列が削除されたりしても、何もアクションは発生せず、リフレッシュは以前と同様に継続されます。 |
|
再初期化: 再作成後の最初のリフレッシュは 初期化 です。 |
|
動的テーブルのリフレッシュは失敗します。変更に対応するために、動的テーブルを再作成する必要があります。 |
動的テーブルリフレッシュのベストプラクティス¶
リフレッシュ専用ウェアハウスを使用する¶
動的テーブルは、リフレッシュを実行するために仮想ウェアハウスを必要とします。動的テーブルパイプラインに関連するコストを明確に把握するためには、動的テーブルに起因する仮想ウェアハウスの消費を分離できるように、専用ウェアハウスを使用して動的テーブルをテストする必要があります。
詳細については、 動的テーブルのコストを理解する をご参照ください。
下流ラグを使用する¶
下流ラグは、依存する他の動的テーブルのリフレッシュが必要なときに、動的テーブルをリフレッシュする必要があることを示します。下流ラグは、その使いやすさと費用対効果の高さから、ベストプラクティスとして利用する必要があります。下流ラグがなければ、複雑な動的テーブルのチェーンを管理するには、最終テーブルのデータ鮮度を監視するだけではなく、各テーブルに個別にターゲットラグを割り当て、関連する制約を管理する必要があります。
詳細については、 動的テーブルのターゲット・ラグの理解 をご参照ください。