Мне нужна рабочая роль, которая берет txt-файл из Blob и насыщает его в таблицу Azure Sql.
Я использую SqlBulkCopy, предоставленный LumenWorks.Framework.IO, я создал 2 версии рабочей роли: 1) прочитал весь файл, загрузил его в DataTable, выполнил SqlBulkCopy 2) StreamRead файл и передал Stream к SqlBulkCopy
Проблема в том, что вторая версия имеет половину производительности первого.
В качестве примера с 10-мегабайтным txt-файлом с 90'000 записями: -первая версия: половина секунды для загрузки файла, 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();
}
}
Что я делаю неправильно?
Взгляните на новую базу данных Azure SQL Database для массовой загрузки непосредственно из учетной записи Azure Storage .
Это должен быть самый быстрый и простой способ достичь того, чего вы хотите, если только вы не потоковываетесь напрямую, а выполняете трансформацию.