はじめに:そのクエリ、途中で打ち切られていませんか?
こんにちは!Snowflakeで分析クエリを走らせていたら、突然こんなエラーが出てびっくりした経験はありませんか?
Statement reached its statement timeout of 3600 seconds and was canceled.
これは「クエリが制限時間に達したので、Snowflake側で強制的にキャンセルされましたよ」というお知らせです。クエリ自体が壊れているわけではないため、対処法を知っていれば落ち着いて解決できます。この記事では、初心者の方に向けて原因の見極め方とタイムアウト値の調整方法をやさしく解説していきます。
そもそもステートメントタイムアウトとは?
Snowflakeには、1つのSQL文(ステートメント)が実行できる最大時間を決める STATEMENT_TIMEOUT_IN_SECONDS というパラメータがあります。デフォルトは 172800秒(=48時間) ですが、アカウント・ウェアハウス・セッション・ユーザーの各レベルで上書き設定が可能です。
ウェアハウスに設定されている値とセッションに設定されている値のうち、小さい方の値が適用されるルールになっています。たとえばウェアハウス側で 3600秒(=1時間)に絞られていれば、セッションでいくら大きく設定してもクエリは1時間で打ち切られます。

よくある原因3パターン
1. クエリ自体が重い・非効率
JOINの組み方が悪い、巨大テーブルにフィルタが効いていない、ウィンドウ関数が膨大な行に対して走っている、などが典型例です。
2. ウェアハウスサイズが小さすぎる
XSウェアハウスで数十億行のスキャンを走らせると、計算リソース不足でいつまでも終わりません。
3. タイムアウト値が短く設定されている
運用都合で「暴走クエリを早めに止めたい」とウェアハウス側に短いタイムアウトを設定しているケースもあります。
現在のタイムアウト値を確認しよう
まずは今いくつに設定されているかを確認しましょう。Snowsightのワークシートで以下を実行します。
-- セッションレベル
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN SESSION;
-- ウェアハウスレベル
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN WAREHOUSE MY_WH;
-- アカウントレベル
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN ACCOUNT;
タイムアウト値を調整する方法
たとえば「このセッションだけ30分まで延長したい」場合は、次のように一時的に変更できます。
-- セッションのみ:1800秒 = 30分
ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = 1800;
-- ウェアハウス単位で変更したい場合
ALTER WAREHOUSE MY_WH SET STATEMENT_TIMEOUT_IN_SECONDS = 3600;
ただし、安易に延ばすとコストが膨らみます。長時間動かすほどクレジット消費は増えていくので、まずはクエリ改善やウェアハウスのスケールアップを試してから、それでも足りない場合に延長するのが鉄則です。

クエリ側から見直すアプローチ
タイムアウトを延ばす前に、まずは原因の切り分けをしてみましょう。Snowsightのクエリ履歴(Query History)からプロファイルを開くと、どのステップで時間を食っているか視覚的にわかります。
- スキャン行数が多すぎないか?(WHERE句の見直し、クラスタリングキー追加)
- JOINのカーディナリティ爆発が起きていないか?
- 大量のRemote Disk I/Oが発生していないか?(キャッシュ活用、ウェアハウスサイズ拡大)
具体的なチューニング手順については、Snowflakeクエリ最適化ベストプラクティス10選もあわせてご覧ください。同時実行クエリが多くて詰まる場合は、マルチクラスタウェアハウスの検討も有効です。

注意したいポイント
- キュー待機にも別パラメータがある: 実行待ち時間の上限は
STATEMENT_QUEUED_TIMEOUT_IN_SECONDSで制御されます。混同しないように気をつけましょう。 - 長時間クエリはコストに直結: タイムアウトを延ばす場合は、ウェアハウス使用状況の可視化でクレジット消費を必ずモニタリングしてください。
- 本番運用ではアカウント単位で適切な上限を: 暴走クエリ対策として、アカウントレベルで現実的な値(例: 7200秒)に絞っておくと安全です。
まとめ
「Statement reached its statement timeout」エラーは、クエリの限界時間に到達してSnowflakeが安全装置を働かせた結果です。まずは SHOW PARAMETERS で現在値を確認 し、必要に応じて ALTER SESSION / ALTER WAREHOUSE で調整、そして根本的にはクエリやウェアハウスの見直しを行うのが王道です。タイムアウトは敵ではなく、コストと品質を守ってくれる味方だと思って、上手に付き合っていきましょう!
参考リンク
- STATEMENT_TIMEOUT_IN_SECONDS – Snowflake公式ドキュメント
- ALTER SESSION – Snowflake公式ドキュメント
- ALTER WAREHOUSE – Snowflake公式ドキュメント
関連記事
- Snowflakeクエリ最適化ベストプラクティス10選|初心者向け早見ガイド – タイムアウトを延ばす前に試したいチューニングのコツ
- Snowflakeマルチクラスタウェアハウス入門|同時実行クエリを増やす仕組み – キュー待ちで詰まっているならこちら
- Snowflakeウェアハウス使用状況の可視化とコスト最適化入門 – 長時間クエリのコスト影響を可視化
- Snowflake「Authentication token has expired」エラーの原因と再ログイン方法 – 別系統のセッション系エラーもあわせて確認


