SQL Serverで「Timeout expired」が出る原因

  • URLをコピーしました!

SQL Serverで「Timeout expired」が出たときは、まず「接続時のタイムアウト」なのか「実行中クエリのタイムアウト」なのかを切り分けるのが最優先です。Microsoftは、接続タイムアウトは既定で15秒、クエリまたはコマンドタイムアウトは既定で30秒になることが多いと案内しています。つまり、単純に「SQL Serverが落ちている」とは限らず、通信経路・接続先設定・SQLの重さ・ロック待ちなど、原因はかなり分かれます。

実際、SQL Serverの現場では、アプリ側では「Timeout expired」としか見えなくても、中身は「サーバー名の誤り」「SQL Serverサービス停止」「TCP/IPやポートの問題」「名前解決失敗」「遅いクエリ」「ブロッキング」など、まったく別の原因であることがよくあります。

闇雲にタイムアウト値だけ延ばすより、まず発生箇所を見極めるほうが解決は早いです。

Timeout expired. The timeout period elapsed prior to completion...
目次

SQL Serverで「Timeout expired」が出る主な原因

SQL Serverで「Timeout expired」が出る主な原因は、次のように整理できます。

原因起きやすい場面確認ポイント
接続先の指定ミス接続直後に失敗するサーバー名、インスタンス名、ポート番号
SQL Serverサービス停止急に接続できなくなったSQL Serverサービスが起動中か
ファイアウォールやポート遮断別PCや別セグメントから接続できないTCP 1433、UDP 1434、許可設定
SQL Browser関連の問題名前付きインスタンス接続SQL Server Browser起動有無
名前解決の失敗サーバー名では失敗、IPでは成功DNS、hosts、ネットワーク疎通
クエリの実行時間が長い一部SQLだけ失敗する実行計画、インデックス、件数増加
ロック・ブロッキング更新系SQLや集計SQLで遅い他セッションの占有、待機
接続プール枯渇アプリで断続的に多発接続のclose漏れ、最大プール数

Microsoftも、接続系ではサーバー名誤り、サービス停止、ポート遮断、Browser未稼働、プロトコル不一致、名前解決不良などを代表例として挙げています。

まず確認したいのは「接続タイムアウト」か「クエリタイムアウト」か

接続タイムアウトの場合

接続開始時点で失敗するなら、ネットワークや接続設定の問題を優先して疑います。たとえば、接続文字列のサーバー名やインスタンス名が間違っている、SQL Serverサービスが停止している、TCP/IPが無効、ファイアウォールで必要ポートが閉じている、といったケースです。Microsoftも、まず完全なエラースタックを見て種類を切り分けるよう案内しています。

クエリタイムアウトの場合

接続は通るのに、特定のSQL実行中だけ失敗するなら、SQL自体の処理時間が長すぎる可能性があります。Microsoftは、アプリが設定した時間内に結果が返らないと、クライアント側で処理を中断してタイムアウトになると説明しています。既定では30秒で設定されることが多いです。

接続タイムアウトで多い原因

サーバー名・インスタンス名・ポート番号の誤り

意外に多いのが、接続先指定のミスです。既定インスタンスと名前付きインスタンスでは接続方法が異なります。名前付きインスタンスなのにポート指定なしで接続していたり、逆に古い接続先が設定ファイルに残っていたりすると、タイムアウトになりやすいです。

SQL Serverサービスが停止している

OS再起動後やメンテナンス後に、SQL Serverサービスが起動していないままになっていることがあります。この場合、アプリ側では単に「Timeout expired」と見えることがあります。SQL Server Configuration Managerやサービス管理画面で、対象インスタンスが起動しているか確認してください。

ファイアウォールやネットワーク遮断

TCP 1433を使う構成では、このポートが閉じているだけで接続できません。名前付きインスタンスではUDP 1434の影響も受けます。サーバー側Windows Defender Firewallだけでなく、社内FWやクラウドのセキュリティグループも確認が必要です。

クエリタイムアウトで多い原因

SQLが重い

テーブル件数の増加により、以前は問題なかったSQLが急に30秒を超えることがあります。特に、インデックス未整備、不要な全件走査、結合条件の不備、曖昧な検索条件は典型例です。タイムアウト値を延ばして一時的に通しても、根本改善にならないことが多いです。

ロックやブロッキングが発生している

更新処理や長時間トランザクションの影響で、対象SQLが待たされている場合もあります。SQL自体は正しくても、他セッションのコミット待ちで30秒を超えればタイムアウトになります。特定時間帯だけ発生するなら、この可能性は高いです。

接続プール枯渇

.NET系アプリでは、接続の解放漏れによりプール内の接続が使い切られ、「接続取得待ち」でタイムアウトになることがあります。Microsoftも、接続を正しく閉じない場合にプール枯渇エラーが起きると案内しています。アプリ改修が必要になることもあります。

SQL Serverで「Timeout expired」が出たときの対処法

STEP
どの処理で止まっているか切り分ける

接続時なのか、SQL実行時なのかをまず確認します。接続ボタンを押した直後に失敗するなら接続系、SELECTやUPDATE実行後にしばらく待って失敗するならクエリ系を疑う流れで十分です。

STEP
接続設定を見直す

サーバー名、インスタンス名、ポート番号、認証方式を確認します。名前付きインスタンスならBrowserサービスや固定ポート設定も要確認です。IP直指定で接続可否を試すと、名前解決の問題も切り分けやすくなります。

STEP
SQL Serverサービスとネットワーク疎通を確認する

サービス起動状態、TCP/IP有効化、FW例外、サーバー疎通を順に確認します。クライアント側だけでなく、サーバー側設定も必ず見てください。接続タイムアウトは、アプリではなくインフラ側が原因のことも多いです。

STEP
重いSQLは実行計画とインデックスを確認する

クエリタイムアウトなら、SQLの見直しが本命です。実行計画でテーブルスキャンが出ていないか、WHERE句やJOIN列に適切なインデックスがあるか、不要な列取得や並び替えがないかを確認します。単にタイムアウト値を延ばすだけでは再発しやすいです。

SQLの処理がどこで時間を消費しているのかを確認したい場合は、実行計画(EXPLAIN PLAN)の読み方を理解しておくと役立ちます。

よくある質問(Q & A)

Timeout expiredはSQL Server本体の障害ですか?

必ずしもそうではありません。接続設定ミス、ネットワーク遮断、名前解決失敗、重いSQL、ロック待ちなどでも発生します。まず接続時か実行時かを分けて確認するのが重要です。

タイムアウト時間を延ばせば解決しますか?

一時的に回避できることはありますが、根本対策ではありません。接続系なら通信や設定、クエリ系ならSQL性能やロック状況を見直す必要があります。

SSMSで発生するTimeout expiredとアプリのTimeout expiredは同じですか?

似たメッセージでも原因は同じとは限りません。SSMS側設定、アプリ側接続文字列、ドライバー設定の違いで発生条件が変わります。発生箇所ごとに切り分けるのが安全です。

まとめ

SQL Serverで「Timeout expired」が出る原因は、大きく分けると「接続できない問題」と「SQLの処理が終わらない問題」です。接続直後に失敗するなら、サーバー名・サービス・ポート・FW・名前解決を確認します。接続後に特定SQLだけ失敗するなら、クエリ性能、ロック、接続プール枯渇を優先して確認するのが基本です。

特に重要なのは、タイムアウト値をむやみに延ばす前に、どの段階で待たされているかを切り分けることです。原因の見極めができれば、対処の方向性もかなり明確になります。

よかったらシェアしてね!
  • URLをコピーしました!
0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
目次
0
あなたの考えが大好きです、コメントしてください。x