0

我有一个从服务(返回 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)

非常感谢。

4

0 回答 0