数か月ごとに、Web サイトのいくつかの選択したページが応答を開始します。
タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
SQL Server Profiler を実行して、データベースがハングアップしている場所を確認しました。特定のストアド プロシージャ上にあります。そこで、ストアド プロシージャ コールを取り、Management Studio で実行しました。1 秒未満で数千行を返します。
プロシージャを開くと、単純な select ステートメントであることがわかります。select ステートメントを取り出して新しいクエリ ウィンドウで実行すると、Management Studio がハングします。
だから私はそれをバラバラに実行し始め、クエリがハングする原因となっている行を見つけます
and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate)
GetDate()
とにかくあるはずな@CurrentDate
ので、切り替えれば問題なく動作します。なぜこれが重要なのですか?私が理解しGetDate
ているように、高価な通話であってはなりません。私は理解IsNull
していますが、GetDate を CurrentDate と交換するだけでクエリをうまく処理できるので、それも問題ではありません。
getdate
このクエリが断続的にハングする原因になっていると思いますか? どのように/なぜそれをするのでしょうか?
少し前に、このエラーは 3 月 23 日、7 月 27 日、10 月 25 日、そして現在は 11 月 21 日に発生しました。いつも月末近くになるようです。この間、何も行われていないことが保証されています (スケジュールされたタスク、メンテナンスなど)。
これは実稼働サーバー上にあるため、実際に問題をデバッグする時間を取ることができませんでした. サイトがダウンするとすぐに、サイトを復旧する必要があります。私はそれを修正する方法を知っています.ストアドプロシージャを強制的に再コンパイルする必要があります.
SQL Server には別の UAT データベースもあり、同じ手順がそのデータベースでもハングします。ただし、まったく同じコード行を持つ他のストアド プロシージャは、両方のデータベースで正常に動作します。
編集: Web サイトを元に戻す必要があったため、ストアド プロシージャを再コンパイルしました。現在、サイトは正常に動作しています。ただし、クエリはまだ単独では実行されません。