我有一个项目,从服务(返回xml)中提取数据,反序列化为对象/实体。
我正在使用EF CF并且测试工作正常,直到它产生大量数据,不是太大,只有150K记录,我使用SQL配置文件来检查SQL语句,它真的很快,但是有一个巨大的生成插入语句的问题很慢。
简单地说,数据模型很简单,类Client有很多子对象集(5)和1对多对多关系。模型的ID是从服务提供的,因此我清理了一个实体(相同ID)的重复实例。
var clientList = service.GetAllClients(); // return IEnumerable<Client> // return 10K clients
var filteredList = Client.RemoveDuplicateInstancesSameEntity(clientList); // return IEnumerable<Client>
int cur = 0;
in batch = 100;
while (true)
{
logger.Trace("POINT A : get next batch");
var importSegment = filteredList.Skip(cur).Take(batch).OrderBy(x=> x.Id);
if (!importSegment.Any())
Break;
logger.Trace("POINT B: Saving to DB");
importSegment.ForEach(c => repository.addClient(c));
logger.Trace("POINT C: calling persist");
repository.persist();
cur = cur + batch;
}
逻辑很简单,将其分解为批处理以加快处理速度。每100个客户端创建大约1000个插入语句(对于子记录和1对多对表)。
使用分析器和日志记录来分析这个。插入后立即
log log POINT B作为最后一步。但我还没有在profiler中看到任何插入语句。然后2分钟后,我看到所有的insert语句,然后是下一批的POINT B.再过2分钟。
我做错了什么或是否有设置或我可以做些什么来改进?
插入1k记录似乎很快。进程启动时数据库被清除,因此没有记录。似乎不是SQL慢的问题,但EF生成插入语句?
虽然项目有效,但速度很慢。我希望加快速度,并在涉及大块数据时更多地了解EF。或者这是正常的吗?
前100个是快速然后变得越来越慢。似乎问题在POINT B.是否有太多的数据repo / dbcontext无法及时处理?
repo是dbcoontext的继承,addClient只是
dbcontext.Client.Add(client)
非常感谢。