当我在本地数据库上运行一个程序来插入100,000条记录时。导入大约需要2秒。切换到Azure SQL后,时间随着DTU的高百分比而增加。
这是我的密码
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()))
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
connection.Open();
var transaction = connection.BeginTransaction();
using (var sqlBulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction))
{
// SET BatchSize value.
sqlBulk.BatchSize = 150000;
sqlBulk.BulkCopyTimeout = 60;
sqlBulk.DestinationTableName = "Master_Transaction";
sqlBulk.WriteToServer(dataTable);
transaction.Commit();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Console.WriteLine($"database running time {ts}");
}
我用Azure SQL测试使用DTU购买的计划后测试的结果是
- 10 DTU 37秒
- 20个DTU 24秒
- 50 DTU 18秒
- 100 DTU 15秒
即使运行时间减少,avg_log_write_percent仍然很高,DTU也很高,如下图所示:第一节第一节第一节第一节第一次
我的问题是
- 如何使用Azure SQL提高SqlBulkCopy的性能?
- 通过固定代码程序
- 通过配置Azure资源
- 我是否可以降低DTU最大值和avg_log_write_percent?
附注
- 表具有聚集索引键
1条答案
按热度按时间z31licg01#
您在测试中使用的所有服务层都基于远程存储(S 0到S3),这意味着您可能会看到IO密集型任务的性能下降。同时,高级层基于本地连接的SSD存储,可提供比基本/标准层更高的IOPS和吞吐量。
除了S 0到S3层的存储相关限制外,在所有这些层上,查询计划都是序列化的,所有查询都以最大并行度= 1执行。不要期望这些服务层上的IO和CPU密集型任务具有良好的性能。