我有一个从服务(返回 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 个多对多表)。
使用分析器和日志记录来分析这一点。在它插入之后
日志始终将 POINT B 显示为最后一步。但我在探查器中还没有看到任何插入语句。然后 2 分钟后,我看到所有插入语句,然后是下一批的 POINT B。又是 2 分钟。
我做错了什么,或者有什么设置或我可以做些什么来改进吗?
插入 1k 记录似乎很快。进程开始时数据库被清除,因此那里没有记录。SQL 缓慢似乎不是问题,而是 EF 生成插入语句?
尽管该项目有效,但速度很慢。当涉及到大块数据时,我想加快速度并更多地了解 EF。或者这是正常的吗?
前 100 个很快,然后越来越慢。似乎是 POINT B 的问题。是否存在太多数据 repo/dbcontext 无法及时处理的问题?
repo 是从 dbcoontext 继承的,而 addClient 很简单
dbcontext.Client.Add(client)
非常感谢。