Dapper를 사용하여 예상보다 오래 걸리는 대량 삽입

dapper performance sqlbulkcopy

문제

이 기사를 읽은 후 저는 Dapper를 사용하는 방식을 자세히 살펴보기로했습니다.

빈 데이터베이스에서이 코드를 실행했습니다.

using (var scope = new TransactionScope())
{
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);

    scope.Complete();
}

그것은 약 20 초 걸렸다. 2500 인서트 / 초입니다. 나쁘지는 않지만 블로그가 45k 인서트 / 초를 달성했다는 것을 고려하면 좋지 않습니다. Dapper에서 더 효율적인 방법이 있습니까?

또한 부수적으로 Visual Studio 디버거를 통해이 코드를 실행하는 데 3 분이 걸렸 습니다! 나는 디버거가 약간 느려지는 것을 알았지 만, 나는 그것을 많이 보아 정말로 놀랐다.

최신 정보

그래서 이거

using (var scope = new TransactionScope())
{
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);

    scope.Complete();
}

using (var scope = new TransactionScope())
{
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);

    scope.Complete();
}

둘 다 20 초가 걸렸다.

그러나 이것은 4 초 걸렸다!

using (var scope = new TransactionScope())
{
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);

    scope.Complete();
}

수락 된 답변

달성 할 수있는 가장 좋은 방법은이 접근법을 사용하여 4 초 만에 50k 레코드였습니다.

SqlTransaction trans = connection.BeginTransaction();

connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members, transaction: trans);

trans.Commit();

전문가 답변

Insert 문 하나만있는 Execute 메서드를 사용하면 대량 삽입을 수행하거나 효율적이지 않습니다. Transaction 대해 허용 된 대답조차도 Bulk Insert 수행하지 않습니다.

Bulk Insert 을 수행하려면 SqlBulkCopy https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy를 사용 하십시오.

이보다 더 빠른 것을 찾지 못할 것입니다.

더퍼 플러스

면책 조항 : 저는 Dapper Plus 프로젝트의 소유자입니다.

이 프로젝트는 무료는 아니지만 모든 일괄 작업을 제공합니다.

  • 대량 삽입
  • 대량 업데이트
  • 벌크 삭제
  • 벌크 머지

(두포 SqlBulkCopy )

또한 신원 값 출력과 같은 몇 가지 옵션이 있습니다.

// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
                 .Table("Orders")
                 .Identity(x => x.ID);

// CHAIN & SAVE entity
connection.BulkInsert(orders)
          .AlsoInsert(order => order.Items);
          .Include(x => x.ThenMerge(order => order.Invoice)
                         .AlsoMerge(invoice => invoice.Items))
          .AlsoMerge(x => x.ShippingAddress);   

우리 도서관은 여러 제공 업체를 지원합니다 :

  • SQL 서버
  • SQL Compact
  • 신탁
  • MySql
  • PostgreSQL
  • SQLite
  • 파이어 버드



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.