この質問は、その質問の続編のようなものです。
ある種のデータで動作するWCFサービスを構築したい場合、それを高速かつ効率的にしたいのは当然です。これを実現するには、SQL Serverなどのデータストレージバックエンドから、そのデータを要求したWCFクライアントまで、データロードトリップのすべてのセグメントが可能な限り高速に機能するようにする必要があります。
その前の質問に対する答えを探している間、コメントを通じて貢献したSlaumaや他の人たちのおかげで、Entity Frameworkの(最初の)大規模なクエリの時間のかかる部分は、オブジェクトの具体化と、データベースが返されます。後続のクエリでは、すべてがはるかに高速に動作することがわかりました。
MergeOption
これらの大規模なクエリが読み取り専用操作として使用されると仮定すると、EFをに設定してNoTracking
、最初のクエリのパフォーマンスを向上させることができるという結論に達しました。私たちが行ったことはNoTracking
、データベースから取得したレコードごとに、同じキーを持っている場合でも、個別のオブジェクトを作成するようにEFに指示することでした。クエリにステートメントがある場合、これにより追加の処理が発生.Include()
し、はるかに大きなサイズのデータが返されます。
データが非常に大きいため、簡単に自問することができます-クエリを高速化した場合でも、オプションを使用して本当に原因を解決できましたか(ステートメントNoTracking
の数によっては、最初の1つだけでした。後続のクエリでは、オプションがないためです。複数のステートメントを使用すると、データがサーバーから返されるときにオプションによってより多くのオブジェクトが作成されるため、より高速に実行されます)?.Include()
NoTracking
.Include()
NoTracking
最大の問題は、この量のデータを効率的にシリアル化し、クライアントで逆シリアル化する方法です。シリアル化はすでに同じくらい遅いので(EF 4.xで生成されたPOCOをクライアントに送信しているためにsetで使用DataContractSerializer
しています)、さらに多くのデータを生成したいですか(のおかげで)?正直なところ、クライアント側に到達するを介して取得されたナビゲーションプロパティを含まない〜11.000オブジェクトのオプションを使用したクエリから発生したデータはまだ見ていません。前回これを実行しようとしたときに、00:10:00のタイムアウトがトリガーされました(!)PreserveObjectReferences
true
NoTracking
NoTracking
.Include()
それで、あなたがまだこのテキストの壁を読んでいるなら、あなたはこの状況を解決する方法を私に教えてください。許容できる結果を達成するために使用するシリアライザーはどれですか?現在、このオプションを使用しない場合、ローカルマシンでのカスタムバインディングのようにNoTracking
、最大11.000のシリアル化、転送、および逆シリアル化にwsHttpBinding
約5秒かかります。私にとって怖いのは、この大きなテーブルには、最終的には最大500.000レコードが含まれる可能性が高いということです。