2016-06-06 4 views
0

에서 다른 값으로 여러 레코드를 업데이트하는 동안 나는 그 값을 조건으로 업데이트되는 테이블을 가지고 있고. 예상대로EF 6 성능 같은 테이블

나는 또한 설정하고 속성

db.Configuration.AutoDetectChangesEnabled = false;     
db.Configuration.ValidateOnSaveEnabled = false; 

아직 결과가 없습니다.

편집 1 :

using(var db= new MyEntities()) 
{ 
    db.Configuration.AutoDetectChangesEnabled = false;     
    db.Configuration.ValidateOnSaveEnabled = false; 

foreach(var acc in myacclist) 
{ 
    //will update my account objects here 
} 
    db.SaveChanges(); 
} 
+0

당신이 우리와 함께 주변의 코드를 공유 할 수 있습니다 . SaveChanges()는 많은 작업을 수행하지만,이 작업의 대부분은 내부 컨텍스트 상태 및 연결 처리에 달려 있습니다. – DevilSuichiro

+0

Myacclist는 100000 점이 있습니까? –

+0

계정이 10000 개 이상 있고 때때로 50k 이상 – Nagaraj

답변

1

불행하게도, 당신이 엔티티 프레임 워크와 SaveChanges를 좋은 성능을 할 수있는 방법은 없습니다.

SaveChange는 모든 레코드 업데이트에 대해 데이터베이스를 왕복 이동합니다. 따라서 현재 10,000 개의 계정이있는 경우 10k 데이터베이스 왕복이 수행됩니다.

AutoDetectChangesEnabled 및 ValidateOnSaveEnabled를 설정하는 것은 대개 실제 문제가되는 데이터베이스 왕복 횟수이므로 성능을 향상시키지 못합니다.

면책 조항는 :

  • BulkDelete BulkUpdate
  • BulkInsert
    • BulkSaveChanges : 나는 Entity Framework Extensions

      이 도서관은 극적으로 수행하여 성능을 향상시킬 수있는 프로젝트의 소유자 해요

    • BulkMerge

    예 :

    using(var db= new MyEntities()) 
    { 
        foreach(var acc in myacclist) 
        { 
         //will update my account objects here 
        } 
    
        db.BulkSaveChanges(); 
    } 
    
  • 0

    스트링 빌더에서 업데이트 쿼리를 구축하고 모든 1K 레코드를 저장하는 제 성능을

    개선
    using (var db = new MyEntities()) 
    { 
        StringBuilder finalquery = new StringBuilder(); 
        int i = 0; 
        foreach (var acc in myacclist) 
        { 
         i++; 
         //will update my account objects here 
         finalquery.Append(stmnt); 
         if (1 % 1000 = 0) { db.Database.ExecuteSqlCommand(finalquery.ToString()); } 
         } 
    
         db.SaveChanges(); 
    }