gpt4 book ai didi

mysql - EF ObjectContext 中的批量插入性能问题

转载 作者:行者123 更新时间:2023-11-30 01:18:28 32 4
gpt4 key购买 nike

我正在尝试将大量行(>10,000,000)插入 MySQL使用 EF ObjectContext(数据库优先)的数据库。看完this question的回答后我编写了这段代码(批量保存)来插入大约 10,000 个联系人(实际上 30k 行;包括相关的其他行):

// var myContactGroupId = ...;

const int maxContactToAddInOneBatch = 100;
var numberOfContactsAdded = 0;

// IEnumerable<ContactDTO> contacts = ...

foreach (var contact in contacts)
{
var newContact = AddSingleContact(contact); // method excerpt below

if (newContact == null)
{
return;
}

if (++numberOfContactsAdded % maxContactToAddInOneBatch == 0)
{
LogAction(Action.ContactCreated, "Batch #" + numberOfContactsAdded / maxContactToAddInOneBatch);
_context.SaveChanges();
_context.Dispose();
// _context = new ...
}
}

// ...

private Contact AddSingleContact(ContactDTO contact)
{
Validate(contact); // Simple input validations

// ...
// ...

var newContact = Contact.New(contact); // Creates a Contact entity

// Add cell numbers
foreach (var cellNumber in contact.CellNumbers)
{
var existingContactCell = _context.ContactCells.FirstOrDefault(c => c.CellNo == cellNumber);

if (existingContactCell != null)
{
// Set some error message and return
return;
}

newContact.ContactCells.Add(new ContactCell
{
CellNo = cellNumber,
});
}

_context.Contacts.Add(newContact);

_context.ContactsInGroups.Add(new ContactsInGroup
{
Contact = newContact,
// GroupId = some group id
});

return newContact;
}

但似乎添加的联系人越多(批量),需要的时间就越多(非线性)。以下是批量大小 100(10k 个联系人)的日志。请注意,随着批处理号的增加,所需的时间也会增加:

12:16:48    Batch #1
12:16:49 Batch #2
12:16:49 Batch #3
12:16:50 Batch #4
12:16:50 Batch #5
12:16:50 Batch #6
12:16:51 Batch #7
12:16:52 Batch #8
12:16:53 Batch #9
12:16:54 Batch #10

...
...

12:21:26 Batch #89
12:21:32 Batch #90
12:21:38 Batch #91
12:21:44 Batch #92
12:21:50 Batch #93
12:21:57 Batch #94
12:22:03 Batch #95
12:22:10 Batch #96
12:22:16 Batch #97
12:22:23 Batch #98
12:22:29 Batch #99
12:22:36 Batch #100

耗时 6 分 48 秒。如果我将批量大小增加到 10,000(需要单个批量),则需要大约 26 秒(对于 10k 个联系人)。但是当我尝试插入 100k 个联系人(每批 10k)时,需要很长时间(我猜每批时间会增加)。

您能否解释为什么尽管上下文已更新,但仍花费越来越多的时间?除了原始 SQL 之外还有其他想法吗?

最佳答案

关于您链接的问题的大多数答案都使用context.Configuration.AutoDetectChangesEnabled = false;我在您的示例中没有看到这一点。所以你应该尝试一下。您可能也想考虑 EF6。为此,它在上下文中有一个 AddRange 方法,请参阅 INSERTing many rows with Entity Framework 6 beta 1

关于mysql - EF ObjectContext 中的批量插入性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18822228/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com