4

Мне нужна рабочая роль, которая берет txt-файл из Blob и насыщает его в таблицу Azure Sql.SqlBulkCopy Azure DataTable быстрее, чем потоковое

Я использую SqlBulkCopy предоставленный LumenWorks.Framework.IO, я создал 2 версии роли работника: 1) читать весь файл, загрузить его в DataTable, выполнить SqlBulkCopy 2) StreamRead файл и передать поток в SqlBulkCopy

Проблема в том, что вторая версия имеет половину производительности первого.

В примере с текстового файла 10MB с 90'000 записей: -first версии: полсекунды для загрузки файла, 2 секунды, чтобы преобразовать в DataTable, 20 секунд для SqlBulkCopy

во- вторых версия: 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(); 
     } 
} 

Что я делаю w Ронг ??

+0

В чем именно вопрос? По SqlBulkCopy у вас есть весь файл в локальной памяти, а затем отправляйте его на сервер. По потоку вы ждете, прежде всего, потока HTTP REST, который приходит к вашему рабочему, затем перенаправляйте его в базу данных Azure SQL. И когда вы нашли быстрее, просто используйте его. – astaykov

+0

Проблема, конечно, в том, что я хочу использовать версию потока, иначе я мог бы иметь проблемы с большими файлами, если бы сразу загрузил их в память. 2 метода делают то же самое, они читают файл и затем выполняют запрос в базе данных, это означает, что логически говоря, если я выполняю эти 2 операции как независимые действия один за другим, они не должны быть быстрее, чем использовать одно действие по используя потоки (по крайней мере, не быстрее). Поэтому мои результаты не имеют смысла, конечно, я допустил ошибку, но что это за ошибка? Я думаю, что это связано с параметрами SqlBulkCopy – Simone

+0

, поэтому в обоих случаях вы читаете файл из Blob? на всякий случай 1 вы сначала загружаете файл, затем загружаете в память, а затем нажимаете на SqlBulkCopy. В то время как второй случай, который вы хотите передать из потока Blob непосредственно в SQLBulkCopy? И в обоих случаях вы измеряете время, начинающееся сначала с операции BLOB (включая время загрузки blob в вашем случае 1)? – astaykov

ответ

0

Посмотрите на новую базу данных базы данных Azure до bulk upload directly from an Azure Storage account.

Это должен быть самый быстрый и простой способ добиться того, чего вы хотите, если только вы не потоковываетесь напрямую, а выполняете трансформацию.

Смежные вопросы