3

数か月ごとに、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 サイトを元に戻す必要があったため、ストアド プロシージャを再コンパイルしました。現在、サイトは正常に動作しています。ただし、クエリはまだ単独では実行されません。

4

1 に答える 1

0

問題の原因を誤解していました。私がバラバラに実行していたクエリは、基本的に次のとおりです。

select *
from Item
left outer join category Subcategories on Subcategories.ItemKey = Item.Id,
Categories Category,
Availability
where Item.Id = @ItemId
  and GetDate() between Availability.EffectiveDate 
      and ISNULL(Availability.ExpiryDate, @CurrentDate) 

これは明らかに本番環境で実行されているクエリではなく、匿名化された例にすぎません。

このクエリは実行されません。それを実行するために、私はもともとコメントアウトしました

and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate)

GetDate()に変更しても実行され@CurrentDateます。私はそれがGetDate問題だと確信していました。ただし、クエリを実行して行をコメントアウトすると、Availablity正常に機能しました。Availability巨大なテーブルです。インデックスの再作成と統計の更新を実行したところ、すべて正常に動作しました。私はGetDate謝罪する義務があると思います。

編集:これはまったく別の環境で再び発生しました。やはりGetDate犯人のようです。その行を変更して手順を実行すると、すべてが再び機能するようになりました。GetDate根本的な原因ではないかもしれませんが、何かがうまくいかないことを示す最初の兆候であることは間違いありません。

于 2011-11-22T15:55:35.440 に答える