我需要一个工作角色,它从 Blob 中获取 txt 文件,并将其批量插入 Azure Sql 表中。
我正在使用 LumenWorks.Framework.IO 提供的 SqlBulkCopy,我创建了两个版本的工作角色:
1) 读取整个文件,将其加载到 DataTable 中,执行 SqlBulkCopy。 2) StreamRead 文件并将 Stream 传递给 SqlBulkCopy。
问题是第二个版本的性能仅为第一个版本的一半。
例如,对于一个有90,000条记录的10MB txt文件: - 第一个版本:加载文件需用半秒钟,转换为 DataTable 需用2秒钟,SqlBulkCopy 需用20秒钟。 - 第二个版本:总共50秒钟(超过两倍!)
我尝试更改 BatchSize,但似乎没有太大区别,我不知道自己错在哪里,这是第二个版本的代码:
我做错了什么?
我正在使用 LumenWorks.Framework.IO 提供的 SqlBulkCopy,我创建了两个版本的工作角色:
1) 读取整个文件,将其加载到 DataTable 中,执行 SqlBulkCopy。 2) StreamRead 文件并将 Stream 传递给 SqlBulkCopy。
问题是第二个版本的性能仅为第一个版本的一半。
例如,对于一个有90,000条记录的10MB txt文件: - 第一个版本:加载文件需用半秒钟,转换为 DataTable 需用2秒钟,SqlBulkCopy 需用20秒钟。 - 第二个版本:总共50秒钟(超过两倍!)
我尝试更改 BatchSize,但似乎没有太大区别,我不知道自己错在哪里,这是第二个版本的代码:
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();
}
}
我做错了什么?
bulkCopy.BatchSize = 1000;
。 - minghan