【发布时间】:2011-04-04 02:08:42
【问题描述】:
我最近使用 LINQ to SQL 和 SQL Server CE 3.5 to Entity Framework 4.1 Code First 和 SQL Server CE 4.0 更新了一个应用程序,现在它的运行速度明显变慢。我做了一些之前和之后的秒表测试,我的应用程序的大多数主要操作似乎平均慢了大约 40%。
我使用 EF Code First 的所有默认策略和配置,除了禁用级联删除。
当我最初发布这个问题时,我专注于一个似乎需要特别长时间的查询,但后来我意识到它只是在第一次运行时特别慢(请参阅下面的评论线程)。
我现在认为我看到的是大多数查询运行速度较慢 - 并没有明显变慢,但速度慢到足以快速加起来,因为应用程序执行的大多数操作都涉及多个查询。
这个应用程序的数据库非常小。 SQL CE (.sdf) 文件只有 458 KB,最大的表不到 250 条记录。
这是一个示例 POCO 类:
public class Target
{
public int Id { get; set; }
public int TrialDefinitionId { get; set; }
public int Number { get; set; }
public int X { get; set; }
public int Y { get; set; }
public string Phase { get; set; }
public virtual TrialDefinition TrialDefinition { get; set; }
}
我所有的类都遵循这个基本模式(简单类型 + 虚拟属性来获取通过外键链接的对象)。我有一个类使用ICollection 来获取多对一关系的列表。
最后说明:我使用存储库模式作为中介,存储库的每次使用都放在using 块中。对于“获取”操作,一旦我从数据库中获取了我需要的数据,这会导致实体分离。
有没有人有任何具体的策略来提高我的 EF Code First 应用程序的性能?请记住,我还没有机会详细阅读 EF。我主要只是想尽可能快速、轻松地从 LINQ 迁移到 SQL 到 EF。对我来说最有用的答案是更改特定策略或配置或其他设置。
【问题讨论】:
-
是什么让你觉得 0.25 秒不合理?您是否还有其他性能数据可以让这款产品脱颖而出?看起来时间完全花在将数据从 DB 传输到 .NET 列表对象上。
-
是仅在第一次访问时花费的时间,还是您连续多次运行此代码?我试图确定是否大部分时间都用于建立初始连接并让数据库引擎运行。完成后,它会开始更快地执行吗?
-
每次都需要这么长时间吗?我发现让第一个查询“假脱机”会产生很大的开销。我不知道在第一次调用时初始化了哪些内部结构,但它们似乎很重要。之后,它通常是一帆风顺的。
-
0.25 秒只是不合理的,如果对整个应用程序的性能有要求的话。如果是这种情况,您需要在对 DB 狂吠之前测量整个应用的性能。
-
+1 不明白为什么这应该被否决
标签: c# linq-to-sql entity-framework sql-server-ce code-first