Самый быстрый способ массовой вставки с помощью Dapper Plus с использованием C # - PullRequest
0 голосов
/ 06 ноября 2018

Я ищу самый быстрый способ сделать массовую вставку, используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...