2011-01-25 11 views
1

SQL Server 2005データベースからのデータをクエリするASP.net Webアプリケーションを用意しました。散発的にタイムアウトする1つのページを持つ。クエリタイムアウト - 散発的

コードをトレースし、SQLを見つけました。クエリツールを使用してSQLを実行すると、常に2秒未満で実行されます。 SQL Serverのデフォルトのタイムアウトは10分です。

これは、SQL Serverのタイムアウトを20分に変更してから10分に戻すための修正です。その後、ページには通常2秒間かかります。

可能性のあるロックを見ましたが、問題を引き起こす可能性のあるものは何も表示されません。唯一の結論は、タイムアウト設定の再設定がプロセスを強制終了させることです。

トレースできるアイデアを探しています。

ありがとうございました

答えて

1

ここでは2つの異なるタイムアウトがあります。接続タイムアウト(接続文字列とSqlConnectionのプロパティとして指定)、およびクエリタイムアウト(プロパティSqlCommand.CommandTimeout)。デフォルト値は

  • 接続タイムアウト:15秒です。
  • クエリタイムアウト:30秒。

照会タイムアウトが」として定義されているすべてのネットワークについての累積タイムアウトは、最初の行が返された後にタイムアウトが依然として発生する可能性があります。その結果の命令の実行または処理中に読み取り、ユーザを含みません処理時間、ネットワーク読み込み時間のみ

ネットワーク読み込み時間が(ネットワーク競合を含めて)消費される理由はたくさんあります。私が探すもの:

  • SQL Serverでブロックしています。
  • 統計情報が古くなりました。
  • 実行計画は、クエリアナライザで適切な実行計画を得ていますか?
  • 失効/準最適実行プランキャッシュ。問題のクエリがパラメータ化されたストアドプロシージャまたはクエリの場合、キャッシュされた実行計画は、クエリが最初に実行されたときに取得されます。最初の呼び出しのパラメータ値に基づいています。その呼び出しのために提供された引数が異常値/非正常値である場合、キャッシュされた実行計画はほとんどの実行に対して準最適である可能性があります。
  • ストアドプロシージャの再コンパイル。 SQL/DMLとDDLをインターリーブするストアド・プロシージャ(例えば、SELECT文をテンポラリ・テーブルの作成にインターリーブする)によって、すべてのテンポラリ・テーブルの作成時に再コンパイルが行われます。コンパイルロックは、実行計画の再コンパイルが完了するまで、同じストアドプロシージャの他のexecが処理されないようにします。一時表を使用する場合、DML CRUDの実行前に表を宣言する必要があります。

接続文字列を使用して接続タイムアウトを指定した場合、既存のプールされたSQL Server接続は使用されません。接続プールキャッシュが使用される接続文字列に基づいているため、あなたはあなたのコネクション/コマンド/ etcを適切に廃棄していますか?読者が読まれるデータを開いたままにしておくと、問題の原因となるロックが残っている可能性が高くなります。いつか、SQL Serverのチョークは、接続を破棄し、同様のロック競合の問題を引き起こすゴーストspidを残します。

関連する問題