将数千行数据插入Azure SQL DB的最高效方法



我正在开发一个导入程序,该导入程序生成需要进入Azure SQL数据库的数据(使用4vCores配置为无服务器(。

我插入的对象只有少数几列

Id : INT
Type : NVARCHAR
Uid : NVARCHAR
Json : NVARCHAR

CCD_ 1数据的大小平均约为1.5kb。我每次导入大约300万行。

我目前的方法是每插入2000行使用一个事务(下面的代码摘录(:

using var transaction = sqlConnection.BeginTransaction (System.Data.IsolationLevel.ReadUncommitted);
cmd = new SqlCommand (insertNodeQuery, sqlConnection) {
CommandTimeout = 600
};
cmd.Transaction = transaction;
cmd.Parameters.AddWithValue ("@Type", node.Type);
[...]
var insertTask = cmd.ExecuteNonQueryAsync ();
tasks.Add (insertTask);

然后我使用Task.WhenAll(tasks)来等待事务完成。

在我的电脑上,这使我每秒可以插入20次(localdb)。然而,对于Azure DB,我每秒只能看到大约5次插入。我知道,这涉及到网络延迟,但即使在同一地区的Azure数据中心(AKS(中运行代码,我也无法接近本地数据库的速度。

这让我想知道是否有更好的方式来运行导入?如果我将生成的内存数据发送到DB,SqlBulkCopy会是一个选项吗?

我还能如何优化性能?

我还能如何优化性能?

SqlBulkCopy是最好的。您可以加载DataTable以加载内存中的数据,也可以使用类似的适配器将内存中对象的集合转换为IDataReader以与SqlBulkCopy一起使用。

您还可以将每个批作为JSON文档作为参数发送到SQL查询,在那里您可以使用OPENJSON读取它。

这两者都应该比单行插入更快。

客户端加载方法(大致(从慢到快依次为:

  • 单行插入,无事务
  • 单行插入,带事务
  • 使用TSQL批处理的单行插入
  • 使用TDS批处理的单行插入(SqlDataAdapter(
  • 使用XML或JSON的大容量插入
  • 带表值参数的大容量插入
  • 使用SqlBulkCopy的大容量插入

最新更新