2

ウェブサイトの 1 つで奇妙な接続タイムアウトに直面しています。

私たちの環境は、IIS 7 Web サーバー (Windows Server 2008 R2 Standard Edition で実行) と SQL Server 2008 データベース サーバーで構成されています。

タイムアウトを引き起こす Web サイト機能をデバッグすると、接続自体が完了するまで数ミリ秒かかることがわかりSqlCommandますが、データベースでストアド プロシージャを呼び出す は実行中に数分間ハングし、タイムアウト例外を発生させます。

一方、ストアド プロシージャをデータベースで直接実行すると、実行が正しく完了するまでに 2 秒しかかかりません。

すでに次のことを試しました。

  • SqlCommandウェブサイト コードのタイムアウトを修正
  • web.configファイルの変更された実行タイムアウト
  • ファイルの変更されsessionStateたタイムアウトweb.config
  • web.configファイルの認証 Cookie タイムアウトの変更
  • IIS の Web サイト プロパティの接続タイムアウトを変更しました
  • IIS のアプリケーション プールのシャットダウン時間制限を変更しました
  • IIS でアプリケーション プールのアイドル タイムアウトを確認しました。
  • SQL Serverのプロパティで実行タイムアウトを確認しました(0、無制限に設定されています)
  • ストアド プロシージャを他のパラメータを使用してデータベース上で直接テストしました

助けていただければ幸いです。

ニラフ

4

3 に答える 3

0

ユーザー向けの検索機能であるストアド プロシージャでも同じ問題が発生しました。ARTIHABORTなどを含め、すべてを試しました。ユーザーは何でも検索できるため、SPは多くのテーブルに参加しました。SP のパラメータの多くはオプションでした。つまり、SP ではデフォルト値が NULL でした。何も機能しませんでした。

ユーザーが値を選択した場所にのみ ADO.NET コードがパラメーターを追加するようにして、「修正」しました。SP の実行時間は数分から数秒になりました。実際の値を持つパラメーターのみが SP に渡されたときに、SQL Server が実行計画をより適切に処理したと想定しています。

これは SQL Server 2000 用であることに注意してください。

于 2011-08-29T16:20:49.430 に答える
0

数年前、アプリを SQL2000 から SQL2008 に移行するときに、同様の問題が発生しました。

OPTION (RECOMPILE)問題が発生していたデータベース内のすべてのストアド プロシージャの末尾に追加しました。私の場合、ストアド プロシージャへの呼び出し間で非常に異なるパラメーターを使用する必要がありました。proc を強制的に再コンパイルすると、SQL は、新しいパラメーターに対して最適ではない可能性のあるキャッシュされたバージョンを使用しようとする代わりに、新しい実行計画を作成するようになります。

まだ行っていない場合は、インデックスを確認してください。ひどく必要なインデックスの欠如ほど、データベースのパフォーマンスを損なうものはありません。不足しているインデックスを表示するクエリに関する適切なリンク ( http://sqlfool.com/2009/04/a-look-at-missing-indexes/ ) を次に示します。

于 2011-12-06T07:10:13.490 に答える
0

非常に遅い提案ですが、他の人にとっては便利かもしれません: 私が見た典型的な問題で、むしろJavaに当てはまるものは次のとおりです:

文字列をパラメーターとして受け取るクエリがあります。その文字列は、データベースの varchar(N) 列の検索基準です。ただし、クエリで文字列 param を Unicode (nvarchar(N)) として送信します。これにより、データ損失の可能性を回避するために、テーブル全体がスキャンされ、すべてのフィールド値が Unicode に変換されて適切に比較されます (SQL Server が入力パラメーターを非 Unicode に変換すると、情報が失われる可能性があります)。

簡単なテスト: クエリを 2 回実行します (簡単にするために、SP であると想定しています)。

exec spWhatever 'input'
exec spWhatever N'input'

彼らがどのように振る舞うかを見てください。また、状況を明確にするために、SSMS のアクティビティ モニターの [Recent Expensive Queries] セクションを見て、実行計画を尋ねることもできます。

乾杯、 エリック

于 2013-04-25T03:47:22.210 に答える