为什么批量导入比INSERT更快?

时间:2017-05-18 07:20:37

标签: sql sql-server performance sql-insert bulkinsert

我正在编写关于将数据从文件导入SQL Server表的方法的研究生工作。我创建了自己的程序,现在我将它与一些标准方法进行比较,如bcp,BULK INSERT,INSERT ... SELECT * FROM OPENROWSET(BULK ...)。我的程序从文件中读取行,解析它们并使用普通的INSERT逐个导入它们。我生成的文件有100万行,每行有4列用于测试。现在我的情况是我的程序工作160秒,而标准方法工作5-10秒。

因此,问题是为什么BULK操作的速度超过100万次INSERT?他们是否使用特殊手段?你可以解释一下,还是给我一些有用的链接?谢谢!

3 个答案:

答案 0 :(得分:6)

  

BULK INSERT可以是最小化记录操作(取决于各种   索引,表约束,恢复模型等参数   数据库等)。最少记录的操作仅记录分配   和解除分配。在BULK INSERT的情况下,只有范围分配   记录而不是插入的实际数据。这将提供   比INSERT好得多。

Compare Bulk Insert vs Insert

实际的优点是减少事务日志中记录的数据量 对于BULK LOGGED或SIMPLE恢复模型,优势非常明显。

Optimizing BULK Import Performance

您还应该考虑阅读以下答案:Insert into table select * from table vs bulk insert

顺便说一句,有些因素会影响BULK INSERT的表现:

  

表是否有约束或触发器,或两者都有。

     

数据库使用的恢复模型。

     

复制数据的表是否为空。

     

表格是否有索引。

     

是否指定了TABLOCK。

     

是从单个客户端复制数据还是复制数据   来自多个客户的并行。

     

是否要在SQL上的两台计算机之间复制数据   服务器正在运行。

答案 1 :(得分:0)

我认为你可以找到很多关于它的文章,只是搜索“为什么批量插入更快”。例如,这似乎是一个很好的分析:

https://www.simple-talk.com/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods/

通常,任何数据库对单个插入都有很多工作:检查约束,构建索引,刷新到磁盘。当在一个操作中进行多个操作时,数据库可以优化这种复杂的操作,而不是逐个调用引擎。

答案 2 :(得分:0)

首先,为行插入行不是最佳选择。请参阅有关设置逻辑的this articlethis article有关将数据加载到SQL Server的最快方法。

其次,BULK导入针对大负载进行了优化。这与SQL Server中的页面刷新,写入日志,索引和各种其他内容有关。这是一篇关于如何优化BULK INSERTS的Technet文章,它揭示了BULK如何更快。但是我连接的次数不能超过两次,因此您必须谷歌进行"优化批量导入性能"。