SQL Server 2014 SP1にアクティブなOLTP 40GBデータベースがあります。IO_Completionの待機、ディスクキューの長さが900に上昇し、SQL Serverが応答を停止すると、クエリが遅くなることがわかりました。私たちが試したもの:
インスタンスを再起動すると、すぐに同じように動作し始めます。
2回目の再起動後、各tempdbデータファイルの初期サイズを変更し(16個のデータファイルが作成されます)、正常に動作し始めました。
注:中間結果セットにはテーブル変数を使用しています。これらの結果セットは非常に小さいです。
それは月に2回起こりました。データファイルに手動で少しのスペースを追加するたびに、正常に動作し始めます。さらに興味深いのは、SQL Server 2008 R2とSQL Server 2012で同じセットアップ(同じハードウェア、同じフォルダーとファイルのセットアップ、同じワークロード)が正常に機能していることです。
恒久的な解決策を見つける手助けをしてください。
すべてのデータファイルの初期サイズは同じ1000MB、現在はそれぞれ1500MBです。すべて同じです。自動拡張はそれぞれ100MBです。これまでは、PFSおよびGAMページの競合に直面していましたが、16まで増加し、問題は解決しました。トレースフラグ1117と1118の両方が有効になっています。2つのNUMAノード上の24コア。すべてのデータファイルは同じボリューム上にあります。シンプルディスク、SANなし。
インスタンスは物理マシン上にあります。テーブル変数を使用したクエリとハッシュ結合を使用したクエリは、最も一般的にIO_Completion待機を生成します。
wBobによる詳細な回答により、さらに詳細に検索するようになりました。以前どのようにそれを見逃しましたか:
データベース「tempdb」のファイル「templog」の自動拡張がユーザーによってキャンセルされたか、7704ミリ秒後にタイムアウトしました。ALTER DATABASEを使用して、このファイルのFILEGROWTH値を小さく設定するか、新しいファイルサイズを明示的に設定します。
これは、この種の問題が発生したときにログに記録されたものです。TempDBを別の高速ドライブに移動しています。