クエリタイムアウトは、コスト管理と想定外のコスト急増の防止に役立つ、Snowflakeユーザーにとって重要な機能です。本記事では、その有用性と設定方法を解説します。
Snowflakeのクエリタイムアウトとは?
クエリタイムアウトは、Snowflakeのクエリが過剰に長時間実行されるのを防ぐための設定です。クエリの実行時間がタイムアウト値を超えると、Snowflakeが自動的にそのクエリをキャンセルします。

なぜタイムアウトを設定するのか
Snowflakeのクエリは仮想ウェアハウス上で実行され、ウェアハウスが起動中(「アクティブ」)である1秒ごとに課金されます。たとえば、大規模なデータセットに対して非効率なクエリを実行し、XLサイズのウェアハウスで完了までに2日かかった場合、このクエリ1本だけで約2,000ドルのコストが発生します。
クエリタイムアウトを短く設定すれば、長時間実行されるクエリによる想定外の課金を防ぎ、コストをコントロールできます。
Snowflakeのデフォルトのクエリタイムアウトは?
Snowflakeにおけるセッションおよびウェアハウスのデフォルトのクエリタイムアウトは2日間(172,800秒)です(出典)。デフォルト値がかなり長いため、ほとんどのユーザーはより短い値への変更を検討すべきでしょう。
Snowflakeでクエリタイムアウトを設定する方法
クエリタイムアウトは、アカウント全体・ユーザー単位・セッション単位・ウェアハウス単位の4つのスコープで設定できます。いずれの方法でも STATEMENT_TIMEOUT_IN_SECONDS パラメータを使用します。
セッションのクエリタイムアウト
現在のセッションのクエリタイムアウト設定を確認するには、以下のコマンドを実行します。
1show parameters for session
現在のセッションのクエリタイムアウトを1時間に設定するには、以下のコマンドを実行します。
1alter session set statement_timeout_in_seconds = 3600
ユーザーのクエリタイムアウト
特定のユーザー(analytics_user)のクエリタイムアウト設定を確認するには、以下のコマンドを実行します。
1show parameters for user analytics_user
特定のユーザーのクエリタイムアウトを1時間に設定するには、以下のコマンドを実行します。
1alter user analytics_user set statement_timeout_in_seconds = 3600
アカウント全体のタイムアウト
アカウントのクエリタイムアウト設定を確認するには、以下のコマンドを実行します。
1show parameters for account
多くの場合、デフォルトの2日間(172,800秒)に設定されているはずです。これを1日に短縮するには、以下のコマンドを実行します。
1alter account set statement_timeout_in_seconds = 86400
ウェアハウスのクエリタイムアウト
既存ウェアハウスの現在のクエリタイムアウト設定を確認するには、以下のコマンドを実行します。この例では、ウェアハウス名は COMPUTE です。
1show parameters for warehouse compute
ウェアハウスのクエリタイムアウトを1時間に変更するには、以下のコマンドを実行します。
1alter warehouse compute set statement_timeout_in_seconds = 3600
新しいウェアハウスを作成する際にタイムアウトを設定することもできます。
create warehouse compute
warehouse_size = 'XSMALL'
statement_timeout_in_seconds = 3600
;
複数のタイムアウトが設定されている場合、どれが適用されるのか
複数のクエリタイムアウトが設定されている場合、Snowflakeは最も短い値を適用します。たとえば、セッションのタイムアウトが1時間、ウェアハウスのタイムアウトが10分であれば、Snowflakeは10分を超えて実行されたクエリをすべてキャンセルします。
Snowflakeでタスクのタイムアウトを設定する方法
Snowflakeのタスクのタイムアウトは USER_TASK_TIMEOUT_MS パラメータで設定します。デフォルトのタイムアウトは1時間です(出典)。クエリタイムアウトの単位が秒であるのに対し、こちらの単位はミリ秒である点に注意してください。
ウェアハウスやセッションと同様、show parameters for task my_task を実行すれば現在のタイムアウト設定を確認できます。タスクのタイムアウトを60秒に変更するには、alter task my_task set user_task_timeout_ms = 60000 を実行します。
Snowflakeのタイムアウトでキャンセルされたクエリやタスクも課金対象になるのか
はい、対象になります。Snowflakeは仮想ウェアハウスがアクティブな1秒ごとに課金します。クエリが仮想ウェアハウス上で4時間実行された後にSnowflakeによってキャンセルされた場合、その4時間分のウェアハウス稼働料金が課金されます。
Ian Whitestone・Co-founder & CEO of SELECT
Ianは、SaaS型のSnowflakeコスト管理・最適化プラットフォームであるSELECTの共同創業者兼CEOです。SELECTを立ち上げる前は、ShopifyとCapital Oneで6年間にわたり、フルスタックのデータサイエンス&エンジニアリングチームを率いてきました。Shopifyでは、データウェアハウスの最適化とコストの可視化向上を主導しました。