如何使用Azure SQL提高SqlBulkCopy性能

a11xaf1n  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(115)

当我在本地数据库上运行一个程序来插入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?

附注

  • 表具有聚集索引键
z31licg0

z31licg01#

您在测试中使用的所有服务层都基于远程存储(S 0到S3),这意味着您可能会看到IO密集型任务的性能下降。同时,高级层基于本地连接的SSD存储,可提供比基本/标准层更高的IOPS和吞吐量。
除了S 0到S3层的存储相关限制外,在所有这些层上,查询计划都是序列化的,所有查询都以最大并行度= 1执行。不要期望这些服务层上的IO和CPU密集型任务具有良好的性能。

相关问题