【问题标题】:Optimal insert/update batch for SQL ServerSQL Server 的最佳插入/更新批处理
【发布时间】:2012-10-18 13:50:38
【问题描述】:

我正在使用 c# 代码进行大批量的频繁插入和更新,我需要尽快完成,请帮助我找到加快此过程的所有方法。

  1. 使用StringBuilder 构建命令文本,使用; 分隔语句
  2. 不要使用String.FormatStringBuilder.AppendFormat,它比多次StringBuilder.Append 调用要慢
  3. 重用SqlCommandSqlConnection
  4. 不要使用SqlParameters(限制批量大小)
  5. 使用 insert into table values(..),values(..),values(..) 语法(每条语句 1000 行)
  6. 使用尽可能少的索引和约束
  7. 尽可能使用简单的恢复模式
  8. ?

这里有一些问题可以帮助更新上面的列表

  1. 每个命令(每个ExecuteNonQuery() 调用)的最佳语句数是多少?
  2. 插入和更新是在同一个批次中进行,还是分开执行更好?

tcp 正在接收我的数据,因此请不要建议任何涉及从文件或外部表读取数据的批量插入命令。

插入/更新语句率约为 10/3。

【问题讨论】:

    标签: sql-server performance sql-server-2008 tsql insert


    【解决方案1】:

    使用表值参数。当使用大量行时,它们可以很好地扩展,并且您可以获得接近 BCP 级别的性能。我在博客中介绍了一种从 C# 方面简化该过程的方法here。您需要了解的所有其他信息都在 MSDN 站点 here 上。通过这种方式,您将获得更好的性能,而不是围绕普通 SQL 批处理进行一些小的调整。

    【讨论】:

    • 谢谢你,我会努力做到的,结果会回来的。
    • 我还建议在表上只设置一个索引(集群标识),或者可能将其留在堆上。如果您需要其他索引,请尝试在导入之前删除它们,然后在导入后重新创建它们。
    • 感谢@Gizmo,表格很大,20 列左右。传入的数据不断流动,我仍然必须在该表上运行选择,因此没有必要删除重新创建索引。
    • @Matt 你能谈谈创建 DataTable 与 SqlDataRecords 的性能吗?
    • 好的。我自己测试过,DataTable 慢了 14 倍。
    【解决方案2】:

    从 SQLServer2008 开始,TableParameters 是可行的方法。看这篇文章(第四步)

    http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/

    我将此与并行化插入过程相结合。认为这也有帮助,但必须检查;-)

    【讨论】:

      【解决方案3】:

      在临时表中使用SqlBulkCopy,然后使用MERGE SQL 命令合并数据。

      【讨论】:

      • 这绝对是一个选择,我只是不明白为什么不直接到我的桌子上WriteToServer(DataRow[])?由于我正在尝试使用表值参数,并且无论如何都需要创建数据行,所以我将比较这两种方法的性能。
      • 呃,不,我不能使用它,因为我也需要更新。您可能会建议更新临时表和 MERGE,但我什至不需要测试它会比 TVP 慢
      • 你怎么知道要插入/更新什么?如果您使用 MERGE,则无需获取数据来检查是否需要更新,只需上传您获得的内容并 MERGE。
      • 这很好,但我仍然认为临时表应该更慢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2018-01-30
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多