エピソード

SQL Server コマンド タイムアウト - アプリケーション タイムアウト - 拡張イベントの注意

ODBC または SqlClient を使用してSQL Serverからデータにアクセスする場合、既定では、一定期間 (既定では 30 秒) 内にサーバーからの応答がない場合、クエリは取り消されます。 ODBC または SqlClient は、クエリをSQL Serverに送信した後、タイマーを開始し、30 秒以内にサーバーから結果がない場合、クエリは取り消され、タイムアウト エラー メッセージがアプリケーションに送信されます。 ネットワーク パケット (クエリ結果を含む) が 30 秒以内に受信され、追加のネットワーク パケット (最初のネットワーク パケットに収まらない追加行) が予想される場合は、タイマーが再起動されます。この 30 秒以内に次のネットワーク パケットが受信されない場合、クエリはキャンセルされます。

SQLコマンド タイムアウトの一般的な理由は、長期間実行される最適でないスキーマまたは非効率的なクエリ、またはインデックスのミスやロック待機の問題です。 SQL コマンドのタイムアウト設定を増やすのではなく、クエリを調整することが重要です。

ビデオでは、ネットワーク パケット サイズを小さくするとタイムアウトが解消される例が示されています。このデモでは、ネットワーク パケットがタイマーのリセットにどのように関与しているかを理解し、タイムアウトについて理解を深めます。 ネットワーク パケット サイズの変更は、タイムアウトを回避したり、最適でないスキーマや非効率的なクエリをチューニングしたり、インデックスを追加したり、ロック待機を回避したりするためのソリューションではありません。

コマンド タイムアウト エラーの原因となるコマンドSQL特定するには、拡張イベントを使用し、イベント 'sqlserver.attention' を監視します。 ビデオで使用される拡張イベント スクリプトは、 www.sqlvideo.com/xevents で入手できます。

SQL Server Management Studioでは、接続ダイアログの [オプション] を使用して、SQL コマンドのタイムアウトを変更できます。 既定では、これは '0' に設定されています。これはタイムアウトがないことを意味します。 クエリまたはストアド プロシージャを実行しているときに、[キャンセル] ボタン (赤い四角形) をクリックすると、同じ注意がSQL Serverに送信されます (SQL コマンド タイムアウトなど)。 これにより、拡張イベントで 'sqlserver.attention' イベントが生成されます。

次のビデオでは、SQL コマンド タイムアウトの例を確認できます。 SQLTest ツールはハンズオン ラボをシミュレートします。登録は必要ありません。 ビデオを見ながら、オンラインの実践的な例を練習することができます。