1

私は現在EntityFrameworkでこの状況にあります:

using (TestEntities dataContext = DataContext)
            {
                UserSession session = dataContext.UserSessions.FirstOrDefault(userSession => userSession.Id == SessionId);
                if (session != null)
                {
                    session.LastAvailableDate = DateTime.Now;
                    dataContext.SaveChanges();
                }
            }

これは、私が期待するものと比較して非常に遅いという事実を除いて、すべて完璧に機能しています(1秒あたり14回の呼び出し、100回の反復でテスト)。このコマンドを使用してこのレコードを手動で更新すると、次のようになります。

dataContext.Database.ExecuteSqlCommand(String.Format("update UserSession set LastAvailableDate = '{0}' where Id = '{1}'", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff"), SessionId));

1秒あたり55回の呼び出しがありますが、これは十分に高速です。ただし、session.LastAvailableDateを更新せずに、整数(たとえば、session.UserId)または文字列をEntity Frameworkで更新すると、1秒あたり50回の呼び出しが発生します。これも、十分な速度です。日時フィールドだけがひどく遅いです。

ファクター4の違いは受け入れがたいものであり、Entity Frameworkも使用できるのに直接SQLを使用するのは好きではないので、どうすればこれを改善できるのか疑問に思いました。

私はEntityFramework4.3.1を使用しています(4.1も試しました)。

4

1 に答える 1

0

指摘しておくと、SQL コマンドは 1 つのクエリのみですが、EF コマンドは 2 つのクエリ (データを取得してから保存する) であるため、2 倍の違いが見られます。

また、アドホック クエリではなく ID でクエリを実行すると、パフォーマンスが向上する場合があります。SessionId が主キー ルックアップであると仮定します。

UserSession session = dataContext.UserSessions.Find(SessionId);
于 2012-06-01T16:43:05.023 に答える