대규모 데이터 세트로 Entity Framework 삽입 성능 향상
EF(Entity Framework)에 대규모 데이터 세트를 삽입하면 속도가 느려질 수 있습니다. 이 문서에서는 특히 TransactionScopes를 사용하고 상당한 수의 레코드를 처리할 때 이 프로세스 속도를 크게 높이는 기술을 살펴봅니다.
SaveChanges()
통화 최적화
각 레코드에 대해 SaveChanges()
을 호출하는 일반적인 관행은 대량 삽입에 비효율적입니다. 대신 다음 대안을 고려해보세요.
SaveChanges()
: 모든 레코드가 컨텍스트에 추가된 후 SaveChanges()
을 한 번만 호출하세요.SaveChanges()
: 설정된 레코드 수(예: 100 또는 1000) 후에 SaveChanges()
를 호출합니다.SaveChanges()
을 호출하여 컨텍스트를 폐기하고 특정 레코드 수 이후에 새 컨텍스트를 생성합니다.이러한 방법은 데이터베이스 왕복을 줄이고 변경 내용 추적으로 인한 오버헤드를 최소화합니다.
효율적인 대량 삽입 구현
다음 코드는 최적화된 대량 삽입을 보여줍니다.
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in someCollectionOfEntitiesToInsert) { ++count; context = AddToContext(context, entityToInsert, count, 1000, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext) { context.Set<Entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }</code>
이 예에서는 성능 향상을 위해 자동 변경 감지(AutoDetectChangesEnabled = false
)를 비활성화합니다. AddToContext
메서드는 변경 사항 커밋을 처리하고 선택적으로 지정된 레코드 수 이후 컨텍스트를 다시 생성합니다.
벤치마크 결과
560,000개의 레코드로 테스트한 결과 극적인 개선이 나타났습니다.
SaveChanges()
: 시간
SaveChanges()
100회 기록 후: 20분 이상
SaveChanges()
1000개 레코드 이후(컨텍스트 처리 없음): 242초
SaveChanges()
1000개 레코드 이후(컨텍스트 처리 포함): 191초
결론
이러한 전략은 Entity Framework 대량 삽입 성능을 크게 향상시킵니다. 대규모 데이터 세트를 효율적으로 처리하려면 변경 내용 추적을 비활성화하고 배치SaveChanges()
를 사용하고 컨텍스트를 효과적으로 관리하는 것이 중요합니다.
위 내용은 대규모 데이터 세트를 처리할 때 최대 성능을 위해 Entity Framework 삽입을 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!