EntityFramework. BulkInsert 확장 삽입 데이터 와 EF 자체 삽입 데이터 비교

확장 다운로드 주소:http://efbulkinsert.codeplex.com/
의존 항목 을 동시에 설치 하 십시오. 그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다. 그리고 프로그램 에 같은 dll 의 다른 버 전이 있 습 니 다. 그러면 한 번 에 설치 하지 못 할 수도 있 습 니 다. 설치 의존 dll 을 받 아야 합 니 다.
Install-Package EntityFramework.MappingAPI -Version 6.0.0.7
Install-Package EntityFramework.BulkInsert-ef6
Entity Framework. BulkInsert 는 데이터 와 EF 를 삽입 하 는 것 이 비교적 초보 적 인 추측 입 니 다. 이것 은 여러 개의 sql 을 하나 로 합성 하 는 것 일 뿐 입 니 다. 아무리 최적화 하 더 라 도 마지막 으로 sql 을 생 성 해 야 합 니 다.예 를 들 어 20 개의 데이터, ef 디 버 깅 을 할 때 보 이 는 것 은 한 번 의 연결 이 고 20 번 의 sql 실행 입 니 다. 이 대량 은 한 번 의 연결 이 고 20 개의 sql 조합 은 하나의 문자열 에 제출 하면 시간 을 줄 일 수 있 습 니 다.아무리 최적화 해도 sql 을 줄 일 수 없고 같은 sql 이 데이터베이스 에서 실행 하 는 시간 도 EF 가 줄 일 수 있 는 것 이 아니다.실측 (222 데이터베이스, 표 Finance Receipts): Stopwatch 로 실행 시간 (단위 밀리초) 을 한 번 에 200 개의 증빙 테스트 를 삽입 합 니 다.
EF 삽입 시간: 11, 086 BulkInsert 삽입 시간: 740 회 10000 개 증빙 테스트 삽입
EF 삽입 시간: 510, 640 BulkInsert 삽입 시간: 3, 200 은 코드 를 보고 추측 하 는 실현 방식 과 차이 가 많 지 않 지만 코드 에 표 맵 이 있 는데 왜 이런 기능 이 있 습 니까?
Insert 는 데이터베이스 에 있 는 SqlBulkCopy 보다 기능 이 느 리 기 때 문 입 니 다.
EntityFramework. BulkInsert 확장 은 최적화 문 전송 횟수 와 함께 속도 가 빠 른 SqlBulkCopy 를 사용 하여 데이터 베 이 스 를 삽입 하기 때문에 빅 데 이 터 를 삽입 할 때 EF 자체 의 삽입 데이터 보다 훨씬 빠르다 고 할 수 있다.
그러나 이 SqlBulkCopy 를 이용 하여 데 이 터 를 빠르게 삽입 하면 삽입 에 만 개선 이 있 을 수 있 습 니 다. Update, Delete 데이터 에 대해 속도 가 개선 되 지 않 았 습 니 다. / 테스트 코드 를 대량으로 삽입 할 수 있 습 니 다.
            StringBuilder sb = new StringBuilder();
            FinanceReceipts model = ReceiptsRepository.Entities.Include(o => o.FinanceReceiptDetail).Include(o => o.FinanceBillLog).First(o => o.ReceiptId == 214539);
            int createCount = 10000;
            model.ReceiptId = 0;
            model.ReceiptStatus = -1;
            model.ReceiptNo = "";
            model.FinanceBillLog.OpenSafe().ToList().ForEach(m => m.ReceiptId = 0);
            model.FinanceReceiptDetail.OpenSafe().ToList().ForEach(m => m.ReceiptId = 0);
            model.ActualCreateTime = DateTime.Now;
            List<FinanceReceipts> entities = new List<FinanceReceipts>();
            for (int i = 0; i < createCount; i++)
            {
                FinanceReceipts temp = model.DeepCopy();
                model.ReceiptNo = "ef" + i;
                entities.Add(temp);
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            ReceiptsRepository.Insert(entities);
            sw.Stop();
            sb.AppendFormat("EF    :{0}\r
", sw.ElapsedMilliseconds); model.ActualCreateTime = DateTime.Now; List<FinanceReceipts> entities2 = new List<FinanceReceipts>(); for (int i = 0; i < createCount; i++) { FinanceReceipts temp = model; model.ReceiptNo = "bi" + i; entities2.Add(temp); } sw.Restart(); var ctx = (this.UnitOfWork as UnitOfWorkContextBase).DbContext; using (var transactionScope = new TransactionScope()) { // some stuff in dbcontext ctx.BulkInsert(entities2); ctx.SaveChanges(); transactionScope.Complete(); } sw.Stop(); sb.AppendFormat("BulkInsert :{0}\r
", sw.ElapsedMilliseconds); string ret = sb.ToString();

100 개 삽입, 매번 한 개 삽입, 순환 삽입 테스트
첫 번 째: EF 삽입 시간: 9006 BulkInsert 삽입 시간: 4173 두 번 째: EF 삽입 시간: 8738 BulkInsert 삽입 시간: 3806 세 번 째: EF 삽입 시간: 8784 BulkInsert 삽입 시간: 3727 BulkInsert 는 EF 자체 의 삽입 데이터 보다 조금 빠 릅 니 다. 전체적으로 말 하면:
BulkInsert 는 대체적으로 sql 문 구 를 한 번 만 전달 하고 SqlBulkCopy 로 빠르게 삽입 합 니 다 (증빙 + 증빙 명세서 + 증빙 로그).
한편, EF 는 모든 실체 가 하나의 일반적인 Insert 삽입 (증빙 서류 1 회, 증빙 서류 내 역 이 몇 개 있 으 면 몇 번 전달 되 고 증빙 로그 가 몇 개 있 으 면 몇 번 전달 되 는 지) / / 매번 에 하 나 를 삽입 하고 반복 적 으로 삽입 하 는 테스트 코드 입 니 다.
            StringBuilder sb = new StringBuilder();
            FinanceReceipts model = ReceiptsRepository.Entities.Include(o => o.FinanceReceiptDetail).Include(o => o.FinanceBillLog).First(o => o.ReceiptId == 214539);
            int createCount = 10;
            model.ReceiptId = 0;
            model.ReceiptStatus = -1;
            model.ReceiptNo = "";
            model.FinanceBillLog.OpenSafe().ToList().ForEach(m => m.ReceiptId = 0);
            model.FinanceReceiptDetail.OpenSafe().ToList().ForEach(m => m.ReceiptId = 0);
            model.ActualCreateTime = DateTime.Now;
            List<FinanceReceipts> entities = new List<FinanceReceipts>();
            for (int i = 0; i < createCount; i++)
            {
                FinanceReceipts temp = model.DeepCopy();
                model.ReceiptNo = "ef" + i;
                entities.Add(temp);
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < createCount; i++)
            {
                ReceiptsRepository.Insert(entities[i]);
            }
            sw.Stop();
            sb.AppendFormat("EF    :{0}\r
", sw.ElapsedMilliseconds); model.ActualCreateTime = DateTime.Now; List<FinanceReceipts> entities2 = new List<FinanceReceipts>(); for (int i = 0; i < createCount; i++) { FinanceReceipts temp = model; model.ReceiptNo = "bi" + i; entities2.Add(temp); } sw.Restart(); var ctx = (this.UnitOfWork as UnitOfWorkContextBase).DbContext; for (int i = 0; i < createCount; i++) { using (var transactionScope = new TransactionScope()) { // some stuff in dbcontext ctx.BulkInsert(new List<FinanceReceipts>(){entities2[i]}); ctx.SaveChanges(); transactionScope.Complete(); } } sw.Stop(); sb.AppendFormat("BulkInsert :{0}\r
", sw.ElapsedMilliseconds); string ret = sb.ToString();

첨부: Entity Framework. BulkInsert 의 돌출 점 은 빠 르 지만 실제 응용 에 있어 많은 불편 이 있 습 니 다. 예 를 들 어:
EF 로 삽입 하면 자동 성장 키 는 데이터베이스 의 값 을 가 져 옵 니 다. 그러나 BulkInsert 는 그렇지 않 습 니 다.
외부 키 관련 표 의 데이터, 예 를 들 어 로그, 상세 정보, EF 를 사용 할 때 데이터 가 있 으 면 자동 으로 삽 입 됩 니 다.BulkInsert 를 사용 하면 삽입 하지 않 고 메 인 시트 의 데이터 만 삽입 합 니 다. 또한 업무 에 따라 메 인 시트 의 메 인 키 를 조회 한 다음 에 값 을 부여 해 야 합 니 다. 로그, 자세 한 외부 키 필드 를 사용 해 야 데이터 베 이 스 를 다시 삽입 할 수 있 습 니 다.
이것 은 비교적 번 거 로 운 곳 이다.

좋은 웹페이지 즐겨찾기