自社開発の ORM ソリューションを EntityFramework 5 に変更するための概念実証をまとめようとしていますが、最初に遭遇する問題は深刻なショー ストッパーのようです。
EF5は、アドホックSQLよりもスカラーSQL操作を実行するのに〜9倍長くかかるように見えますが、生成されたSQLコードを見ると、SQL自体はかなりよく書かれているようで、すぐに実行されます。
両方の私のC#コード:
int surveyId = (from survey in upsEntities.Surveys where !survey.Deleted select survey.SurveyID).First();
Debug.WriteLine("Loading surveyId : {0} through Linq took {1}ms using EF5", surveyId,
sw.Elapsed.TotalMilliseconds);
sw.Restart();
string sql = "Select top 1 surveyId from Survey where deleted = 0";
object val = SMSDataManager.Instance.DataAccessManager.ExecuteScalar(sql);
Debug.WriteLine("Loading surveyId : {0} through AdHock SQL took {1}ms using OrmDataManager", val,
sw.Elapsed.TotalMilliseconds);
SQL 出力: EF5:
SELECT TOP (1)
[Extent1].[SurveyID] AS [SurveyID]
FROM [dbo].[Survey] AS [Extent1]
WHERE [Extent1].[Deleted] <> cast(1 as bit)
アドホック:Select top 1 surveyId from Survey where deleted = 0
EF5 を使用すると、Linq を介して surveyId : 1 をロードするのに2965.8625ms かかりました
AdHock SQL を介した surveyId : 1 の読み込みに 384.8073 ミリ秒かかりました
プロファイラーによると、この 2 つの間の期間は、EF5 では 1 ミリ秒ですが、アドホックでは 0 ミリ秒です。問題があるように見えるのは、EF5 の監査ログアウトイベントで、約 3 秒かかります。私のアドホック SQLでは、同じログアウト イベントに約 0.6 秒かかります。
EF5 のこの巨大なオーバーヘッドの原因は何ですか? また、これを軽減または説明するにはどうすればよいですか?