0

SubSonics AddMany() 메서드가 단순한 foreach 루프보다 빠르지 않은지 확인하려고합니다. 나는 SubSonic 사이트에서 조금 펑크지만 성능 통계는별로 보지 못했습니다.SubSonic AddMany() 대 foreach 루프 Add()

현재 가지고있는 것.

records.ForEach(record => 
      { 
       newRepository.Add(record); 
       recordsProcessed++; 
       if (cleanUp) oldRepository.Delete<T>(record); 
      }); 

너무

newRepository.AddMany(records); 
if (cleanUp) oldRepository.DeleteMany<T>(records);  

을 변경 것이다 (.ForEach은() 그냥 그냥 대해 forEach (.....)처럼 작동 이외의 검증이 그것을 가지고 {물건을 할}) 이 방법으로 알아 차리게되면 나는 처리 한 레코드의 수를 잃지 만 비판적이지는 않습니다 ... 그러나이 도구로 이동 된 레코드의 수를 사용자에게 표시 할 수 있으면 좋을 것입니다.

제 질문은 다음과 같습니다. AddMany()를 사용하면 눈에 띄게 빨라지겠습니까? 실제로 복사 된 레코드 수를 계산할 수있는 방법이 있습니까? 성공하면 모든 레코드가 처리되었다고 가정 할 수 있습니까? 하나의 레코드가 실패하면 전체 프로세스가 실패합니까?

미리 감사드립니다.

답변

0

명백히하기 위해 AddMany()는 행당 개별 쿼리를 생성하고 일괄 처리를 통해 제출합니다. DeleteMany()는 단일 쿼리를 생성합니다. 쿼리가 어떻게되는지 알고 싶으면 소스 코드와 생성 된 SQL을 참조하십시오.

첫 번째 방법은 느립니다 : 2 * N 쿼리. 그러나 일괄 처리를 사용하여 쿼리를 제출하면 더 빠릅니다.

두 번째 방법은 더 빠릅니다 : N + 1 쿼리. '레코드'를 열거함으로써 간단하게 추가 할 항목 수를 확인할 수 있습니다.

배치의 용량 제한을 초과 할 위험이있는 경우, 패널티가 거의없는 상태에서 한 번에 50 또는 100을 제출하십시오.

최종 질문은 거래에 따라 다릅니다. 전체 작업이 하나의 트랜잭션 인 경우 중단 작업을 하나의 트랜잭션으로 커밋합니다. 그렇지 않으면 각 쿼리가 단독으로 실행됩니다. 너의 선택.