C# 提高在EF中插入一对多关系数据的性能
由于数据库的特殊设计结构,我在EF中的性能非常差。以下是相关关系:C# 提高在EF中插入一对多关系数据的性能,c#,sql-server,database,entity-framework,database-design,C#,Sql Server,Database,Entity Framework,Database Design,由于数据库的特殊设计结构,我在EF中的性能非常差。以下是相关关系: 我有以下数据模型: 我已经尝试过通过批量(即一次插入1000条记录)来优化样本数据的插入。这确实有帮助,但即使在SampleTime字段上有一个索引,随着添加更多记录,查找查询似乎需要更长的时间 因此,我的问题是,如何改进向数据库添加示例数据的设计和/或性能?是否有更好的数据库结构来处理一对多关系?如果我能在性能上获得适当的补偿,我愿意在数据库设计上做出一些妥协,但我仍然需要能够处理与给定的采样时间实体框架相关联的不同
我有以下数据模型:
我已经尝试过通过批量(即一次插入1000条记录)来优化样本数据的插入。这确实有帮助,但即使在
SampleTime
字段上有一个索引,随着添加更多记录,查找查询似乎需要更长的时间
因此,我的问题是,如何改进向数据库添加示例数据的设计和/或性能?是否有更好的数据库结构来处理一对多关系?如果我能在性能上获得适当的补偿,我愿意在数据库设计上做出一些妥协,但我仍然需要能够处理与给定的
采样时间
实体框架相关联的不同数据。实体框架维护所有本地实体的本地缓存,并跟踪这些实体中所做的任何更改。随着实体数量的增加,检查的费用也会增加
这是一个非常有趣的系列文章,介绍DetectChanges是如何工作的,以及您可以对此做些什么。请特别注意第3部分
当我需要批量加载大量数据时,我会禁用DetectChanges,并在保存后清除本地缓存,以便释放内存:
public static void ClearDbSet<T>(this DbContext context) where T : class {
var entries = context.ChangeTracker.Entries<T>().Where(e => e.State == EntityState.Unchanged);
foreach (DbEntityEntry<T> entry in entries.ToList()) {
entry.State = EntityState.Detached;
}
}
publicstaticvoidcleardset(这个DbContext上下文),其中T:class{
var entries=context.ChangeTracker.entries(),其中(e=>e.State==EntityState.Unchanged);
foreach(entries.ToList()中的DbEntityEntry){
entry.State=EntityState.Detached;
}
}
ToList
调用是必需的,否则迭代器将抛出异常。以最大化测试数据的负载性能
DONT run project in Debug mode (multiple factor slower for EF)
使用以下设置:
Context.Configuration.LazyLoadingEnabled = false;
Context.Configuration.ProxyCreationEnabled = false;
Context.Configuration.AutoDetectChangesEnabled = false;
Context.Configuration.ValidateOnSaveEnabled = false;
每100个条目或更少,放弃上下文
Using( new context)
试一试
Context.Set().AddOrUpdate(poco);
而不是
Context.Set<TPoco>().firstorDefault(lamba);
Context.Set<TPoco>().Add(poco);
Context.Set().firstorDefault(lamba);
Context.Set().Add(poco);
EF6 beta 1有一个AddRange功能,可以满足您的需要:
请注意,我链接到的文章提到了在EF5中将AutoDetectChangesEnabled设置为false的技术,@felipe引用了该技术您是否已经尝试过臭名昭著的
context.Configuration.AutoDetectChangesEnabled=false代码>设置(直接在创建上下文之后)?另外,是否可以在SQL Server 2012 Express的SQL Management Studio中启用探查器?或者这只在付费的SQL Server版本中可用?没关系。找到:。什么是“输入”变量?它是内存中的集合吗?您知道其中的最小和/或最大时间戳吗?你能将该范围内的所有SensorSamples加载到内存中,而不是逐个访问数据库吗?请注意AddOrUpdate-这些都是很好的建议,在我发布问题之前,我正在尝试其中一些建议,但首先需要反馈。在批处理模式下批量插入时,我确实放弃了上下文。我最担心的是,查询必须检查现有的SensorSample
,以便将数据添加到现有数据或创建新数据。我认为,取消这一限制可能会大大加快速度,但需要对数据库结构进行非规范化的更改。谢谢。有人知道EF 6的发布时间表吗?我还没有看过任何提议的变化。“今年”,即2013年-
Using( new context)
Context.Set<TPoco>().AddOrUpdate(poco);
Context.Set<TPoco>().firstorDefault(lamba);
Context.Set<TPoco>().Add(poco);