我需要一个worker角色,它从Blob获取一个txt文件并将其批量转换为Azure Sql表。
我正在使用LumenWorks.Framework.IO提供的SqlBulkCopy, 我创建了2个版本的worker角色: 1)读取整个文件,将其加载到DataTable中,执行SqlBulkCopy 2)StreamRead文件并将Stream传递给SqlBulkCopy
问题是第二个版本的性能是第一个版本的一半。
作为10MB txt文件的示例,具有90'000条记录: - 第一个版本:加载文件半秒,转换为DataTable需要2秒,SqlBulkCopy需要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();
}
}
我做错了什么?
答案 0 :(得分:0)
查看bulk upload directly from an Azure Storage account的新Azure SQL数据库功能。
这应该是实现您想要的最快速,最简单的方法,除非您不是直接流式传输,而是进行转换。