エピソード

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 ツールはハンズオン ラボをシミュレートします。登録は必要ありません。 ビデオを見ながら、オンラインの実践的な例を練習することができます。

ご意見およびご提案がある場合は、 こちらから問題を送信してください