2

非常に奇妙な問題があります。

一連のデータを返すストアド プロシージャがあります。この手順はかなり複雑な結合と集計を行うため、実行に 700 ミリ秒かかります。

SQL Studio で直接呼び出された場合、プロシージャは常に正しい値を返し、常に約 700 ミリ秒の時間がかかります。

ただし、クライアント ソフトウェア (C# または Excel) 経由で呼び出すと、しばらくは機能しますが、突然、手順に 30 秒 (!) かかり、タイムアウトになります。ディスクの読み取り回数は正常ですが、CPU は上昇しています。

この動作は 1 ~ 2 時間続き、その後は正常に戻ります。この間、プロシージャがこの動作を示した場合でも、SQL Studio でプロシージャを実行できます。また、他のより単純な手順も、クライアントで呼び出されたときに通常どおり実行されます。

プロファイラーで呼び出しを確認しました。クライアント経由で呼び出す場合、呼び出しは「RPC」としてマークされ、SQL Studio で呼び出す場合は「SQL」となります。

したがって、おそらく手順は正常に実行されますが、RPC を介したデータ転送が何らかの理由でハングしています。しかし、これは推測にすぎません。

誰かアイデアがありますか、または私たちに何らかの方向性を示すことができますか? どこを見たらいいのかわからない。イベントログも空です。

4

2 に答える 2

0

.NET アプリケーションは、定義済み (デフォルト) のコマンド タイムアウト値を使用します。この期間は、コマンドやクエリによってはおそらく十分ではありません。アプリケーションでカスタム コマンド タイムアウトを定義してみてください。

前述のように C# アプリケーションを使用していると思います。データベース コンテキストのコンストラクター (EF コード ファースト アプローチ) で次の定義を行うと、問題が解決する場合があります。

public MyDBContext()
      : base("MyDB")
  {
      ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
  }

私はこの定義を C# ベースのアプリケーションで、SQL サーバーのストアド プロシージャを実行する EF と共に使用しています。

幸運を!

于 2013-10-12T08:48:23.197 に答える