SqlBulkCopy 在单个记录上?

djs*_*djs 4 .net c# 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
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 5

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

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