gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:21:55 24 4
gpt4 key购买 nike

我正在开发一个导入器,它生成需要进入 Azure SQL DB 的数据(配置为具有 4vCore 的无服务器)。

我插入的对象只有少数列

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

Json 数据平均大小约为 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) 等待事务完成。

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

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

我还能如何优化性能?

最佳答案

How else can I optimize the performance?

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

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

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

客户端加载方法(粗略地)按最慢到最快的顺序是:

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

关于sql-server - 将数千行数据插入 Azure SQL DB 的最高效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71498577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com