SQL Server的高容量插入

时间:2018-03-27 23:25:18

标签: sql-server

我正在寻找关于如何实现大规模插入过程的一些建议,比如每秒400条记录的调整。数据来自外部实时触发器,当数据发生更改时,应用程序将收到通知。当数据发生变化时,我需要消耗它。

我已经研究了几种不同的批处理实现,包括使用datatables / sqlbulkcopy或写入csv和消费。

你能推荐什么?

2 个答案:

答案 0 :(得分:2)

每秒400次插入并不意味着它应该带来任何重大挑战。这取决于您要插入的内容,是否有任何索引可能因插入而导致页面拆分,以及在插入过程或脚本期间是否有任何额外的逻辑。

如果你想逐个插入它们,我建议只构建一个准系统存储过程,它将它的参数简单地插入到没有索引,约束,任何东西的临时表中。这将允许您非常快速将数据导入数据库,并且您可以通过每一分钟或其他事件单独处理并批量处理行。

或者,您可以让应用程序存储记录,直到达到某个数字,然后使用表值参数将proc插入到数据库中。然后,您只需要插入一个您选择批量处理的行数。这个成本应该是微不足道的。但请注意,如果您的应用程序在插入足够的行之前崩溃,那么这些行将丢失。

SqlBulkCopy是一个功能强大的工具,但顾名思义,它是为批量加载表而构建的。如果您有持续的插入请求流,我建议使用它来加载您的数据。如果您想要批量处理大量请求以便一次性加载所有这些,这可能是一种很好的方法,但不是一种经常性和频繁的活动。

答案 1 :(得分:1)

这对我来说效果很好。我不能保证你每秒400:

    private async Task BulkInsert(string tableName, DataTable dt)
    {
        if (dt == null)
            return;

        using (SqlBulkCopy bulkCopy = new SqlBulkCopy("./sqlserver..."))
        {
            bulkCopy.DestinationTableName = tableName;
            await bulkCopy.WriteToServerAsync(dt);
        }
    }