单个记录上的SqlBulkCopy?

时间:2014-09-24 21:42:36

标签: c# .net sql-server performance

我的软件可以部署在两种不同的配置中:一种是我全天偶尔收到单个数据点的涓涓细流,另一种是我在一天结束时收到所有数据的转储。显然,对于日终转储,我将使用具有可配置批量大小的SqlBulkCopy()命令。

但是,为了简单起见,我想通过将批量大小设置为1来在trickle-feed中使用相同的代码。这样做会产生很大的开销吗?我可以更好地进行单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
    }
}

1 个答案:

答案 0 :(得分:3)

你会坐火车到拐角处的杂货店吗?您可以将批量复制用于偶尔的单行插入,但如果单行是规则而不是异常,我建议不要这样做,因为这似乎是您的用例。也就是说,如果插入很少,你可能根本不会注意到开销。您要避免的主要是连续的单行批次流。

我在几年前的SQL最佳化SQL Server插入性能的SQL周六会话上运行了许多各种插入方法和大小的性能测试。使用单线程应用程序,单行参数化插件的速率约为每秒2,200次,而带有DataTable源的单行SqlBulkCopy约为500 /秒(服务器CPU时间的两倍)。您可以从sqlsaturday.com/154/schedule.aspx下载Power Point。