2017-09-19 4 views
-2

확장자를 사용하지 않고 수천 개의 레코드 (10K +)를 저장하는 방법을 찾고 있습니다. 합리적인 실행 시간으로 대량의 데이터를 정확하게 업데이트하는 방법에 대한 아이디어가 있습니까?확장없이 Entity Framework에서 여러 레코드 저장을 최적화하는 방법은 무엇입니까?

현재 내 문제는 dbContext.SaveChanges()를 호출 할 때 약 10K 레코드 만 수정되었을 때 20K + 레코드를 업데이트하는 수정 된 레코드뿐만 아니라 메모리의 모든 레코드를 메모리에 저장한다는 것입니다.

+0

이 질문의 사본을 여러 개 찾을 수 있습니다. 당신은 이것을 묻는 첫 번째 사람이 아닙니다. –

답변

1

당신은 SqlBulkCopy를 사용하고 싶지 않으니까 대답은 AFAIK입니다. 실적이 좋은 시간에 EF를 사용하여 해당 양의 레코드를 삽입 할 수 없게됩니다. 한편 SqlBulkCopy의를 사용하여 완료 "영원히"가했다 EF를 ... 사용하여 14000 개 라인을 삽입 |

어쨌든 여기에 내가 업데이트하려고 할 때 그냥 당신에게 통찰력을 제공하기 위해,

DataTable dt = new DataTable("Table"); 
dt = GetDataTableFromSomewhereElse(); 
using (SqlConnection conn = new SqlConnection("YourConnectionString")) 
       { 
        using (SqlCommand command = new SqlCommand("", conn)) 
        { 
         try 
         { 
          conn.Open(); 
          command.CommandText = @"Create Table #TmpTable(
           [Col1] [int] NOT NULL, 
           [Col2] [nvarchar](max) NOT NULL, 
           [Col3] [decimal](18, 2) NOT NULL)"; 
          command.ExecuteNonQuery(); 
          using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) 
          { 
           bulkCopy.BulkCopyTimeout = 660; 
           bulkCopy.DestinationTableName = "#TmpTable"; 
           bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col1", "Col1")); 
           bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col2", "Col2")); 
           bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col3", "Col3")); 

           bulkCopy.WriteToServer(dt); 
           bulkCopy.Close(); 
          } 

          command.CommandTimeout = 300; 
          command.CommandText = [email protected]"MERGE INTO Table p 
           USING #TmpTable t ON p.Col1 = t.Col1 
           WHEN MATCHED THEN UPDATE SET 
           p.Col2 = t.Col2, 
           p.Col3 = t.Col3, 
           WHEN NOT MATCHED THEN 
           INSERT VALUES(
           t.Col1, 
           t.Col2, 
           t.Col3 
           ); 
           Drop Table #TmpTable;"; 
          command.ExecuteNonQuery(); 
         } 
         catch (Exception ex) 
         { 
          ... 
         } 
        } 
       } 

SqlBulkCopy의

의 예 약 2-3 초가 걸렸습니다.