我正在编写关于将数据从文件导入SQL Server表的方法的研究生工作。我创建了自己的程序,现在我将它与一些标准方法进行比较,如bcp,BULK INSERT,INSERT ... SELECT * FROM OPENROWSET(BULK ...)。我的程序从文件中读取行,解析它们并使用普通的INSERT逐个导入它们。我生成的文件有100万行,每行有4列用于测试。现在我的情况是我的程序工作160秒,而标准方法工作5-10秒。
因此,问题是为什么BULK操作的速度超过100万次INSERT?他们是否使用特殊手段?你可以解释一下,还是给我一些有用的链接?谢谢!
答案 0 :(得分:6)
BULK INSERT可以是最小化记录操作(取决于各种 索引,表约束,恢复模型等参数 数据库等)。最少记录的操作仅记录分配 和解除分配。在BULK INSERT的情况下,只有范围分配 记录而不是插入的实际数据。这将提供 比INSERT好得多。
实际的优点是减少事务日志中记录的数据量 对于BULK LOGGED或SIMPLE恢复模型,优势非常明显。
Optimizing BULK Import Performance
您还应该考虑阅读以下答案:Insert into table select * from table vs bulk insert
顺便说一句,有些因素会影响BULK INSERT的表现:
表是否有约束或触发器,或两者都有。
数据库使用的恢复模型。
复制数据的表是否为空。
表格是否有索引。
是否指定了TABLOCK。
是从单个客户端复制数据还是复制数据 来自多个客户的并行。
是否要在SQL上的两台计算机之间复制数据 服务器正在运行。
答案 1 :(得分:0)
我认为你可以找到很多关于它的文章,只是搜索“为什么批量插入更快”。例如,这似乎是一个很好的分析:
通常,任何数据库对单个插入都有很多工作:检查约束,构建索引,刷新到磁盘。当在一个操作中进行多个操作时,数据库可以优化这种复杂的操作,而不是逐个调用引擎。
答案 2 :(得分:0)
首先,为行插入行不是最佳选择。请参阅有关设置逻辑的this article和this article有关将数据加载到SQL Server的最快方法。
其次,BULK导入针对大负载进行了优化。这与SQL Server中的页面刷新,写入日志,索引和各种其他内容有关。这是一篇关于如何优化BULK INSERTS的Technet文章,它揭示了BULK如何更快。但是我连接的次数不能超过两次,因此您必须谷歌进行"优化批量导入性能"。