2014-09-18 2 views
1

Sql 테이블에 Linq를 사용하여 대량 삽입을 시도하고 있습니다. 저는 아직 linq을 배우는 중입니다. 그러니 친절하십시오.Linq with Sql (Bulk Insert)

모든 것이 훌륭하게 가져 오기 때문에 코드는 문제가되지 않지만 프로세스가 너무 느립니다. 약 15k 개의 레코드가있는 반면 각 레코드는 4 초입니다.

문제의 주된 핵심은 (내가 생각하기에) 레코드를 추가하기 전에 먼저이 레코드가 이미 존재하는지 확인해야합니다. 중복이 없는지 확인해야합니다. 그래서 이미 기존의 15k 레코드 데이터베이스로 검색을 수행하고 레코드를 찾으면 true/false 응답을 보냅니다.

 Dim expr = From spare In db.tblSpareParts Where spare.SparePartDeleted = False Select spare 
     For Each part In expr 
      If part.SparePartYnumber = ynumber Then 
       Return True 
      End If 
     Next 
     Return False 

액세스 문서를 반복하는 주요 코드.

끝에
 For Each Me.dr In dt.Rows 
      If dr.Item(0).ToString <> "" Then 
       blnfoundit = db.getynumberinfo(dr.Item(0).ToString) 
       If blnfoundit Then 
        db.setSparePart("Toevoegen", dr.Item(0).ToString, dr.Item(1).ToString, "", "", "Mat Ref: " & dr.Item(2).ToString & " - Vendor : " & dr.Item(5).ToString, 0, 0, CInt(IIf(dr.Item(12).ToString = "", 0, dr.Item(12).ToString))) 
       End If 
      End If 
     Next 

는 SQL의 모든 배치하는 코드의 조각 :이 과정을 빠르게하는 방법에 대한

   Dim sqlimport As New tblSparePart 
       With sqlimport 
        .SparePartCurrentStock = currentstock 
        .SparePartDeleted = False 
        .SparePartDescription = description 
        .SparePartLastModified = DateTime.Now() 
        .SparePartLocation = location 
        .SparePartMinimumStock = minimumstock 
        .SparePartPrice = price 
        .SparePartRemarks = remarks 
        .SparePartType = type 
        .SparePartUserName = General.username 
        .SparePartYnumber = ynumber 
       End With 
       db.tblSpareParts.InsertOnSubmit(sqlimport) 
       db.SubmitChanges() 

어떤 아이디어?

Btw, 나는 비슷한 것들을 웹에서 찾았고 SqlBulkCopy에 대해 뭔가 발견했다. 그러나 나는 그것을 사용하는 방법에 대해 전혀 모른다. 응답에 미리 I have a Tags Table. How to Bulk Insert using LINQ?

감사합니다,

답변

1

이 엔티티에 전혀 LINQ처럼 작동하는 경우 속도 저하가 여기에 각 레코드에 대해 객체를 추적 변화를 만드는 것을 실제로

거트.

그런 경우 DbContext.Configuration.AutoDetectChangesEnabled = False을 사용하여 변경 내용 추적을 사용하지 않도록 설정할 수 있습니다. 변경 감지는 루프가 완료되고 전체 컨텍스트가 처리 될 때까지 연기됩니다.

EF의 측면에 대한 자세한 내용은이 문서를 참조하십시오 : 아마도 http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.objecttrackingenabled(v=vs.90).aspx

:이 문서에 설명 된대로 SQL에 LINQ와 문제에 관해서는 DbContext AutoDetectChangesEnabled set to false detecting changes

, 당신은 DataContext.ObjectTrackingEnabled 재산으로 보일 수를 루프 전에이 속성을 false로 설정하고 나중에 SubmitChanges 전에 true로 설정하면 성능이 향상 될 수 있습니다.

+0

응답 해 주셔서 감사합니다. 이제 업데이트가 절반 정도되었으므로 먼저 업데이트가 완료됩니다. 내일 당신의 제안이 트릭을 할 수 있는지 한번 볼 것입니다. – GertDeWilde