Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提高在EF中插入一对多关系数据的性能_C#_Sql Server_Database_Entity Framework_Database Design - Fatal编程技术网

C# 提高在EF中插入一对多关系数据的性能

C# 提高在EF中插入一对多关系数据的性能,c#,sql-server,database,entity-framework,database-design,C#,Sql Server,Database,Entity Framework,Database Design,由于数据库的特殊设计结构,我在EF中的性能非常差。以下是相关关系: 我有以下数据模型: 我已经尝试过通过批量(即一次插入1000条记录)来优化样本数据的插入。这确实有帮助,但即使在SampleTime字段上有一个索引,随着添加更多记录,查找查询似乎需要更长的时间 因此,我的问题是,如何改进向数据库添加示例数据的设计和/或性能?是否有更好的数据库结构来处理一对多关系?如果我能在性能上获得适当的补偿,我愿意在数据库设计上做出一些妥协,但我仍然需要能够处理与给定的采样时间实体框架相关联的不同

由于数据库的特殊设计结构,我在EF中的性能非常差。以下是相关关系:



我有以下数据模型:



我已经尝试过通过批量(即一次插入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);