4

Blob에서 txt 파일을 가져 와서 Azure Sql 테이블로 가져 오는 작업자 역할이 필요합니다.)이 SqlBulkCopy의 2를 실행 1), 전체 파일을 읽기의 DataTable에로드 :SqlBulkCopy Azure DataTable이 스트리밍보다 빠릅니다.

나는 작업자 역할의 두 버전을 만들었습니다 LumenWorks.Framework.IO에서 제공하는 SqlBulkCopy의, 을 사용하고 있습니다 StreamRead the 파일 및 스트림을 SqlBulkCopy에 전달하십시오.

문제는 두 번째 버전의 성능이 첫 번째 성능의 절반과 비슷하다는 것입니다. 90'000 레코드 약 10MB의 TXT 파일과 예로서

: - 첫 버전 : 반 SqlBulkCopy의

- 두번째 들어 DataTable을 변환 2 초 20 초 파일을로드하는 제 버전 : 50 초 총계 (두 배 이상!)

BatchSize를 변경하려고했지만 많은 차이점이없는 것으로 보입니다. 무엇이 잘못되었는지는 모르겠지만 여기 2 인치 버전입니다. 코드 :

using (var stream = await blockBlob.OpenReadAsync(cancellationToken)) 
using (var reader = new StreamReader(stream)) 
using (var csv = new CsvReader(reader, true, ';')) 
using (var conn = new SqlConnection(CloudConfigurationManager.GetSetting("TestDbConn"))) 
{ 
     await conn.OpenAsync(cancellationToken); 
     connAperta = true; 
     using (var transaction = conn.BeginTransaction()) 
     using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.TableLock, transaction)) 
     { 
      bulkCopy.BulkCopyTimeout = 300; 
      bulkCopy.DestinationTableName = "[3sc_base_1]"; 
      await bulkCopy.WriteToServerAsync(csv, cancellationToken); 
      transaction.Commit(); 
     } 
} 

내가하고있는 것 rong ??

+0

정확히 여기서 질문은 무엇입니까? SqlBulkCopy를 사용하면 전체 파일을 로컬 메모리에 저장 한 다음 서버로 보낼 수 있습니다. 스트리밍을하면 먼저 HTTP REST 스트림이 작업자에게 도착한 다음 Azure SQL 데이터베이스로 리디렉션 될 때까지 대기합니다. 그리고 더 빨리 발견하면 사용하십시오. – astaykov

+0

물론 스트림 버전을 사용하고 싶습니다. 그렇지 않으면 메모리에 한 번에로드하면 더 큰 파일에 문제가 발생할 수 있습니다. 2 가지 방법은 똑같은 일을하고, 파일을 읽은 다음 데이터베이스에서 쿼리를 실행합니다. 즉, 논리적으로 말하면 두 가지 작업을 순차적 인 작업으로 실행하면 하나씩 작업을 수행하는 것보다 빠르지 않아야합니다. 스트림을 사용합니다 (적어도 빠른 것은 아닙니다). 그래서 제 결과는 말이되지 않습니다. 물론 실수를 저지 렸습니다.하지만 그 실수는 무엇입니까? 나는 그것이 SqlBulkCopy 옵션 – Simone

+0

과 관련이 있다고 생각합니다. 두 경우 모두 Blob에서 파일을 읽는 중입니까? 경우 1의 경우 먼저 파일을 다운로드 한 다음 메모리에로드하고 SqlBulkCopy를 누릅니다. 두 번째 경우는 Blob 스트림에서 SQLBulkCopy로 직접 스트리밍 하시겠습니까? 그리고 두 경우 모두 BLOB 작업부터 시작하여 시간을 측정합니다 (사례 1의 BLOB 다운로드 시간 포함)? – astaykov

답변