0

データアクセス用のEntityFrameworkを備えたMVC4アプリケーションがあります。私のアプリケーションは、これまでのところ、ページの1つが約13,000行以上を返し、接続がタイムアウトするまで、かなりうまく機能しているように見えました。さらに、13,000以上の行を返すページを実行しようとすると、サイトの残りの部分も非常に遅くなり始めます。かなり複雑なlinqクエリを使用していますが、Stack Exchangeミニプロファイラーを使用しており、これからのSQLを使用しているため、クエリにかかる時間は1秒未満であると判断しました(LINQクエリから生成されたSQLを実行することで確認できます) SSMSを直接;おそらく2秒、上)。プロファイラーは、返される結果セットが小さい場合でも、「T + 0.97ms、Reader10393ms」のように言います。最終的には正常に戻ります。

READERステートメントが私に言っていることに関するドキュメントについてはほとんど成功していません。これは、結果をWebサーバーにストリーミングするのにかかる時間であることを意味しますか?とにかく、誰かがここで何が起こっているのか考えているなら、私はそれを大いに感謝します。誰かが望むならLINQコードを投稿することができますが、私が言ったように、それが生成するSQLは良いと確信しています。

ありがとう

編集:私が言及するかもしれない1つのこと:これは中程度の信頼の下で実行されている共有ホスティング環境にあります。また、関連する場合は、タイムアウトスタックトレースを次に示します。

System.Data.EntityCommandExecutionException:コマンド定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。---> System.Data.SqlClient.SqlException:タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。System.Data.SqlClient.SqlConnection.OnError(SqlException例外、ブールブレーク接続)でSystem.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()でSystem.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet BulkCopyHandler、TdsParserStateObject stateObj)at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()at System.Data.SqlClient.SqlDataReader.get_MetaData()at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior runBehavior、

4

1 に答える 1

0

私はそれを理解したと思います。残念ながら、コードを投稿することは実際には許可されていませんでしたが、Linqクエリの最後に.AsNoTracking()を追加すると、リーダーの実行時間が約3〜4秒に短縮されたことがわかりました。このような大きなモデルに対して変更追跡を有効にして、非常に多くのオブジェクトを具体化することがボトルネックだったと思います。これは読み取り専用のリストであるため、これは許容されます。

@bleepzter、私はあなたの提案を試しましたが、SQLを直接実行する方がはるかに高速だったので、これは間違いなく解決策への道に私を導きました。

于 2013-03-29T17:49:39.623 に答える