仅针对单个记录使用SqlBulkCopy?

4
我的软件可以采用两种不同的配置进行部署:一种是我会在一天中零散地不时接收到单个数据点的微量输入,另一种是在一天结束时获得所有数据的转储。对于最后的全量数据转储,显然,我将使用可配置批大小的 SqlBulkCopy() 命令。
然而,为了简便起见,我想在微量输入中只使用相同的代码,并将批大小设置为 1。这样做是否会有显著的开销?对于微量输入,使用单个 INSERT 调用是否更好?
工作流程如下:
ICollection<MyClass> dataPoints = ...;
public void AddDataPoint(MyClass data)
{
    dataPoints.Add(data);
    if (dataPoints.Count >= ConfigurableBatchSize)
    {
        DoBulkCopy(dataPoints); // converts MyClass objects into rows of a DataTable, etc
    }
}

2
批量复制可以处理一个记录和一千个记录的情况,效果一样好。 - crthompson
1个回答

5
你会乘火车去角落杂货店吗?对于偶尔的单行插入,您可以使用批量复制,但如果单行插入是规则而不是例外情况(似乎是您的使用情况),我建议不要这样做。尽管如此,如果插入很少,您可能根本不会注意到开销。要避免的主要事项是连续的单行批处理。
几年前,在一个SQL Saturday会议上,我运行了许多关于各种插入方法和大小的性能测试,该会议的主题是最大化SQL Server插入性能。使用单线程应用程序,单行参数化插入的速率约为每秒2,200次,而使用DataTable来源的单行SqlBulkCopy速度约为每秒500次(需要双倍的服务器CPU时间)。您可以从sqlsaturday.com/154/schedule.aspx下载PowerPoint。

1
坦白地说,如果乘火车一样容易的话,我会选择乘火车。我理解去杂货店乘火车的开销,但我不理解批量复制的开销。直觉上,似乎会有开销,但我正在努力找出“有多少”开销以及缺点是什么。 - djs
@djs,我在几年前的一个SQL Saturday会议上进行了许多不同插入方法和大小的性能测试,主题是最大化SQL Server插入性能。使用单线程应用程序,单行参数化插入的速率约为每秒2,200次,而使用DataTable源的单行SqlBulkCopy速率约为每秒500次(服务器CPU时间翻倍)。您可以从http://www.sqlsaturday.com/154/schedule.aspx下载PowerPoint演示文稿。 - Dan Guzman
@DanGuzman,你的演示文稿还有其他地方可以得到吗?尝试了链接,但被Red Gate买走了。 - Wouter van Rij
1
@WoutervanRij,我在这里上传了PowerPoint文件链接。它已经有将近10年的历史了,所以需要使用当前SQL Server版本和其他技术(如JSON)进行更新。 - Dan Guzman
@DanGuzman 谢谢。依然很有用,阅读时学到了很多。 - Wouter van Rij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接