Sql server SQL Server的大容量插入

Sql server SQL Server的大容量插入,sql-server,Sql Server,我正在寻找一些关于如何实现大规模插入过程的建议,比如每秒400条记录。数据来自外部实时触发器,当数据发生更改时,应用程序将收到通知。当数据发生变化时,我需要使用它 我研究了几种不同的批处理实现,包括使用datatables/sqlbulkcopy或写入csv和consuming 你能推荐什么吗?这对我来说很有效。我不能保证每秒400次,但是: private async Task BulkInsert(string tableName, DataTable dt) {

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

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


你能推荐什么吗?

这对我来说很有效。我不能保证每秒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);
        }
    }

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

如果您想一个接一个地插入它们,我建议您只构建一个基本的存储过程,它可以简单地将其参数插入到一个没有索引、约束或任何内容的临时表中。这将允许您非常快速地将数据输入数据库,并且您可以每分钟或其他时间执行一个单独的过程,并分批处理这些行

或者,您可以让应用程序存储记录,直到达到某个数字,然后使用表值参数通过proc将它们插入数据库。然后,无论您选择了多少行进行批处理,您都只有一个insert。这样做的成本应该是微不足道的。但是请注意,如果您的应用程序在插入足够的行之前崩溃,这些行将丢失


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

400个不同的呼叫/秒?或者每秒需要插入一批400行?从何处生成400个插入?你刚刚试过直接插入它们吗?为什么需要成批执行?缓冲
n
记录,然后使用
SqlBulkCopy
或表值参数。我每秒收到400个不同的调用。我不需要对它们进行批处理,我想最好是将记录一起批处理—只需对数据库进行一次调用,然后关闭连接。我试过直接插入它们,效果不错,似乎有更好的选择。我想知道其他人都做了些什么,他们能推荐些什么。@ta.speot.is很想看看你们是如何使用缓冲区的。请详细说明或发布一个答案,谢谢。我也尝试过这个,我很快就达到了我的记忆极限。尽管服务器正在升级(CPU和RAM),但可能还可以。数据表似乎很昂贵。