Я ищу самый быстрый способ сделать массовую вставку, используя Dapper Plus.
Я искал вокруг и не нашел ответа ни на этом сайте, ни на сайте Dapper Plus.
Сейчас я использую что-то вроде:
DapperPlusManager.Entity<T_PARENT>().Table("T_PARENT")
.Identity(c => c.PK)
.AfterAction((kind, parent) =>
{
if(kind == DapperPlusActionKind.Insert)
{
parent.T_CHILDREN.ToList().ForEach(child => child.FK = parent.PK);
}
}
Тогда
Connection
.BulkInsert<T_PARENT>(Parents)
.ThenBulkInsert(c => c.T_CHILDREN);
или
DbTransaction Trans = Connection.BeginTransaction();
Trans
.BulkInsert<T_PARENT>(Parents)
.ThenBulkInsert(c => c.T_CHILDREN);
Trans.Commit();
Хотя он работает, он довольно медленный при вставке огромного количества сложных объектов.
В моем случае мы добавляем в базу данных в общей сложности 100 000 объектов, и для этого метода требуется около 60 секунд.
Есть ли способ выполнить эту операцию быстрее?
Редактировать:
Я должен был упомянуть, что я работаю над базой данных Oracle 11g.
Я также должен был упомянуть, что у меня нет другого выбора, кроме как использовать Entity Framework и Dapper Plus для этого.
Редактировать:
В моем тестовом случае у меня в основном две ситуации:
Случай 1: для каждого вставляемого нами T_PARENT мы также добавляем несколько тысяч T_CHILD.
Случай 2: для каждого вставляемого нами T_CHILD мы вставляем только несколько T_CHILD (меньше 10).
В случае 1 операция выполняется довольно быстро (около 10 с), а в случае 2 - сравнительно медленнее (около 30 с).
Причина кажется очевидной, так как в случае 1 количество операций над T_PARENT намного меньше, чем в случае 2.