トリガーされるタスク¶
トリガータスクを使用して、 ストリーム に変更があるたびにタスクを実行します。これにより、新しいデータの可用性が予測できない場合に、ソースを頻繁にポーリングする必要がなくなります。また、データが即座に処理されるため、待ち時間も短縮されます。
トリガーされたタスクは、イベントがトリガーされるまでコンピュート・リソースを使用しません。
考慮事項¶
トリガータスクは以下の項目でサポートされています。
テーブル
ビュー
動的テーブル
Apache Iceberg™ テーブル(管理対象と非管理対象)
データ共有
ディレクトリテーブル。ディレクトリテーブルは、トリガータスクが変更を検出できるようにする前に、リフレッシュする必要があります。変更を検出するには、次のいずれかのタスクを実行できます。
ディレクトリテーブルを自動リフレッシュする ようにセットします。
ALTER STAGE name REFRESH コマンドを使用して、ディレクトリテーブルを手動で更新します。
トリガータスクは以下の項目ではサポートされていません。
ハイブリッドテーブル
外部テーブルのストリーム
コンシューマーが共有テーブルやセキュアビューに対してストリームを作成できるようにするには、データプロバイダーが自分のアカウント内で共有対象となるテーブルやビューに対して、変更追跡を有効にする必要があります。つまり ALTERVIEW<view_name>SETCHANGE_TRACKING = TRUE;`です。変更追跡が有効になっていない場合、コンシューマーは共有データに対してストリームを作成できません。詳細については、 :ref:`label-data_sharing_streams をご参照ください。
トリガーされたタスクの作成¶
CREATE TASK を使用し、以下のパラメーターをセットします:
WHEN句を使用してターゲット・ストリームを定義します。(SCHEDULEパラメーターは含めないでください)。-
ユーザーが管理するウェアハウスで実行するタスクを作成するには、
WAREHOUSEパラメーターを含め、ウェアハウスを定義します。サーバーレスタスクを作成するには、
TARGET_COMPLETION_INTERVALパラメーターを含める必要があります。WAREHOUSEパラメーターは含めないでください。Snowflakeは、ターゲット完了間隔を使用して必要なリソースを推定し、この時間内にタスクを完了するように調整します。
次の例では、ストリーム内のデータが変更されるたびに実行される、サーバーレストリガータスクを作成します。
既存のタスクをスケジュールタスクからトリガータスクに移行する¶
タスクを中断します。
タスクを更新するには、ALTER TASK を使用してください。
SCHEDULEパラメータの設定を解除し、WHEN句を追加してターゲットストリームを定義してください。タスクを再開します。
既存のユーザー管理のトリガータスクをサーバーレスのトリガータスクに移行する¶
タスクを中断します。
タスクを更新するには、ALTER TASK、 を使用してください。
WAREHOUSEパラメーターを削除してから、TARGET_COMPLETION_INTERVALパラメーターを設定してください。タスクを再開します。
詳細情報については、 サーバーレスタスク をご参照ください。
トリガータスクの実行を許可する¶
トリガータスクを作成すると、タスクはサスペンド状態で開始します。
ストリームの監視を開始します。
ALTER TASK ... RESUME を使ってタスクを再開。
タスクは以下の条件で実行されます。
トリガータスクを初めて再開すると、タスクは最後のタスクの実行後にストリームに変更がないか確認します。変更がある場合、タスクが実行されます。そうでない場合は、コンピューティングリソースを使用せずにタスクをスキップします。
タスクが実行中で、ストリームに新しいデータがある場合、タスクは現在のタスクが完了するまで一時停止します。Snowflakeはタスクのうち1つのインスタンスのみが一度に実行されるようにします。
タスクが完了すると、Snowflakeはストリームに変更がないか再度チェックします。変更があればタスクは再度実行され、変更がなければタスクはスキップされます。
このタスクは、ストリームに新しいデータが検出されるたびに実行されます。
ストリームデータがディレクトリテーブルでホストされている場合は、次のタスクのいずれかを実行して変更を検出します。
タスクが12時間実行されない場合、Snowflakeはストリームが古くなるのを防ぐためにヘルスチェックをスケジュールします。このヘルスチェックのタイミングは保証されていません。Snowflakeが変更を検出しない場合、タスクは計算リソースを使用せずにスキップされます。タスクの手順は、データ保持の有効期限が切れる前にストリームデータを消費する必要があります。そうしないと、ストリームは古くなります。詳細については、:ref:`label_streams-manage-avoiding-stream-staleness`をご参照ください。
デフォルトでは、トリガータスクは最大30秒ごとに実行されます。タスクの実行中に再度トリガーされると、次の実行は前の実行がスケジュールされてから30秒後に開始されます。USER_TASK_MINIMUM_TRIGGER_INTERVAL_IN_SECONDS パラメーターを設定すると、この間隔を10秒に短縮できます。
Streams on views によってタスクがトリガーされると、クエリ内の結合、集約、フィルターに関係なく、Streams on Views クエリによって参照されるテーブルへの変更もタスクのトリガーとなります。
Monitor triggered tasks¶
SHOW TASKSとDESC TASK出力では、SCHEDULEプロパティはトリガータスクのためにNULLを表示します。information_schemaスキーマとaccount_usageスキーマのtask_historyビューの出力では、SCHEDULED_FROM列がTRIGGERと表示されます。
例¶
例1:2つのストリームのいずれかでデータが変更されるたびに実行されるユーザー管理タスクを作成します。
例2:2つの異なるデータストリームでデータの変更が検出されるたびに実行されるユーザー管理タスクを作成します。このタスクは AND 条件を使用するため、2つのストリームの一方にしか新しいデータがない場合、タスクはスキップされます。
例3:ディレクトリテーブル内のデータが変更されるたびに実行されるユーザー管理タスクを作成します。この例では、ストリーム --- my_directory_table_stream --- が、ステージmy_test_stage 上の :doc:` ディレクトリテーブル </user-guide/data-load-dirtables-manage>` でホストされています。
トリガーされたタスクを検証するために、ステージにデータが追加されます。
その後、ディレクトリテーブルが手動で更新され、タスクがトリガーされます。