插入一行列表的批量插入效率

Bulk insert efficiency for inserting a list with one row

我正在尝试使用批量插入并将其替换为我项目中的当前通用插入。一些插入请求(BillType.Booklet)是一个单行列表,其他是一个多行列表。

   public async Task CreateBill(List<BillReceiverDto> Receivers, BillType BillType)
    {
       
       var bulkList =new List<BillReceiverDto>();

        if (BillType == BillType.Booklet)
        {
            bulkList.Add(Receivers.FirstOrDefault());
        }
        else
        {
            bulkList.AddRange(Receivers);
        }

        await _dbContextProvider.GetDbContext().BulkInsertAsync(bulkList);
    }

Bulk insert对于插入大数据,特别是100条以上的数据有很好的性能。它在75毫秒内插入5000个实体。但是使用批量插入一行列表是否有效?有没有开销之类的缺点...?

我相信 BulkInsertAsync 扩展在后台使用了 SqlBulkCopy。在这种情况下,不久前我在博客上发布了一些基准测试,可能会有用。

虽然我没有专注于单行插入,但与 Table 值参数方法相比,将 SqlBulkCopy 用于较少行数 (100) 时似乎确实有成本。随着卷的增加,SqlBulkCopy 会降低性能,但对于低卷会有明显的开销。多少开销?在宏伟的计划中,您可能不会注意到 10 毫秒。

如果您要处理多达数百行,我实际上建议使用 Table 值参数方法来提高性能。更大的卷 - SqlBulkCopy。

根据您的 needs/views 此处的开销,我很想检查您必须插入多少行并使用最适合该卷的机制。就个人而言,如果这是一个非常典型的场景,我不会将 SqlBulkCopy 用于较少的行,因为开销。

博客: https://www.sentryone.com/blog/sqlbulkcopy-vs-table-valued-parameters-bulk-loading-data-into-sql-server

免责声明:我是Entity Framework Extensions

的所有者

这取决于您使用的图书馆 Aref Hemati,

在我们的库中,如果要插入的实体不超过 10 个,我们直接使用 SQL 语句。所以 SqlBulkCopy 开销没有被使用。

因此即使只有一行也可以使用我们的库,但显然针对成百上千行进行了优化。