[解決済み] Entity Frameworkが遅すぎる。どうすればいい?[クローズド]
質問
私は、quot;Don't optimize prematurely" のマントラに従い、Entity Frameworkを使用してWCFサービスをコード化しました。
しかし、私はパフォーマンスをプロファイリングし、Entity Frameworkはあまりにも遅いです。 (私のアプリは約1.2秒で2メッセージを処理し、私が書き直している(レガシー)アプリは同じ時間で5-6メッセージを処理します。 (レガシーアプリはDBアクセスのためにsprocsを呼び出します)。
私のプロファイリングは、Entity Frameworkがメッセージごとに時間の大部分を取っていることを指摘します。
それで、私のオプションは何でしょうか?
-
もっと良いORMがあるのでしょうか?
(普通にオブジェクトの読み書きをサポートし、高速に処理するもの...) -
Entity Frameworkを高速化する方法はありますか?
( ノート : 私がより速いというのは、最初の呼び出しではなく、長い目で見たときのことです。 (最初の呼び出しは遅いですが(メッセージに15秒)、それは問題ではありません。 私はちょうどそれがメッセージの残りのために速くなることを必要とします)。 -
私のサービスからより多くの速度を得るのを助ける、何か謎の第3のオプション。
NOTE 私のDBの操作のほとんどは、作成と更新です。 選択と削除はほとんど行いません。
どのように解決するのですか?
Entity Frameworkで実際に発行されるSQLコマンドのプロファイリングから始める必要があります。構成 (POCO, Self-Tracking entities) に応じて、最適化の余地がたくさんあります。SQLコマンドをデバッグすることができます(デバッグモードとリリースモードの間で異なってはいけません)。
ObjectSet<T>.ToTraceString()
メソッドを使用して SQL コマンドをデバッグできます。さらなる最適化が必要なクエリに遭遇した場合、達成しようとしていることに関するより多くの情報を EF に与えるために、いくつかの予測を使用することができます。
例を挙げます。
Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10
ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
dto.Categories.Add(new CategoryDto { Name = category.Name });
}
と置き換えることができる。
var query = from p in db.Products
where p.Id == 10
select new
{
p.Name,
Categories = from c in p.Categories select c.Name
};
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
dto.Categories.Add(new CategoryDto { Name = categoryName });
}
私はこれを頭の中でタイプしただけなので、これが正確にどのように実行されるかではありませんが、EFは、クエリについて知っていることすべて(この場合、カテゴリ名が必要であること)を伝えれば、実際にはいくつかの素晴らしい最適化を行っています。しかし、これはイーガーローディング(db.Products.Include("Categories"))とは異なり、プロジェクションによってロードするデータ量をさらに減らすことができるからです。
関連
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersionの違いは何ですか?
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み] Entity Frameworkで生成されたSQLを表示するにはどうすればよいですか?
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] プライベートメソッドのユニットテストはどのように行うのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ファイル *.mdf をデータベースとして添付できません。
-
[解決済み] COMExceptionエラー80040154を修復する方法は?
-
[解決済み] EF Coreのadd-migrationのビルドに失敗しました。
-
[解決済み] ファイルまたはアセンブリ 'System.Data.SQLite' をロードできませんでした。
-
[解決済み] ASP.NET control to render a <div>
-
[解決済み] .net の OOM 問題を解決する必要があります。
-
[解決済み] 実際のサービスはデータを返すのに、なぜWebServiceはnullを返すのですか?
-
[解決済み] ORM(Object-Relational Mapping)における「N+1 selects問題」とは?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] Entity Frameworkにおける最速の挿入方法