EntityFramework. BulkInsert 확장 삽입 데이터 와 EF 자체 삽입 데이터 비교
의존 항목 을 동시에 설치 하 십시오. 그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다. 그리고 프로그램 에 같은 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 를 사용 하면 삽입 하지 않 고 메 인 시트 의 데이터 만 삽입 합 니 다. 또한 업무 에 따라 메 인 시트 의 메 인 키 를 조회 한 다음 에 값 을 부여 해 야 합 니 다. 로그, 자세 한 외부 키 필드 를 사용 해 야 데이터 베 이 스 를 다시 삽입 할 수 있 습 니 다.
이것 은 비교적 번 거 로 운 곳 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.