SELECTSELECT

SELECT

Snowflakeでクエリタイムアウトを使いこなす

By Ian WhitestoneMar 18, 20233 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

クエリタイムアウトは、コスト管理と想定外のコスト急増の防止に役立つ、Snowflakeユーザーにとって重要な機能です。本記事では、その有用性と設定方法を解説します。

Snowflakeのクエリタイムアウトとは?

クエリタイムアウトは、Snowflakeのクエリが過剰に長時間実行されるのを防ぐための設定です。クエリの実行時間がタイムアウト値を超えると、Snowflakeが自動的にそのクエリをキャンセルします。

SELECT query timeout

なぜタイムアウトを設定するのか

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では、データウェアハウスの最適化とコストの可視化向上を主導しました。