我正在写我的研究生工作,内容是关于从文件导入数据到SQL Server表的方法。我已经创建了自己的程序,现在我正在比较它与一些标准方法,如bcp,批量插入,插入...SELECT * FROM OPENROWSET(BULK...)我的程序从源文件中读入行,解析它们,然后使用普通的插入逐个导入它们。该文件包含100万行,每行4列。现在我遇到了这样的情况,我的程序需要160秒,而标准方法需要5-10秒。
所以问题是为什么批量操作更快?他们用的是特殊的手段还是什么?你能给我解释一下或者给我一些有用的链接吗?
发布于 2017-05-18 15:32:28
BULK INSERT可以是日志记录最少的操作(取决于各种参数,如索引、表的约束、数据库的恢复模型等)。最低限度记录的操作只记录分配和释放。在大容量插入的情况下,仅记录区分配,而不记录所插入的实际数据。这将提供比INSERT更好的性能。
实际的好处是减少了记录在事务日志中的数据量。
在使用大容量日志或简单恢复模式的情况下,这种优势非常明显。
Optimizing BULK Import Performance
您还应该考虑阅读这个答案:Insert into table select * from table vs bulk insert
顺便说一下,有一些因素会影响大容量插入的性能:
表是否具有约束和/或触发器。
数据库使用的恢复模式。
要复制数据的表是否为空。
表是否有索引。
是否指定了TABLOCK。
是从单个客户端复制数据还是从多个客户端并行复制数据。
是否在运行SQL Server的两台计算机之间复制数据。
发布于 2017-05-18 15:31:13
我想你可以找到很多关于它的文章,只要搜索“为什么大容量插入更快”。例如,这似乎是一个很好的分析:
通常,任何数据库对于一次插入都有大量的工作:检查约束、建立索引、刷新到磁盘。当在一个操作中执行多个操作时,数据库可以优化这种复杂的操作,而不是逐个调用引擎。
发布于 2017-05-18 15:39:41
首先,逐行插入不是最优的。有关将数据加载到SQL Server的最快方法,请参阅this article on set logic和this article。
其次,大容量导入针对大负载进行了优化。这一切都与页面刷新、写入日志、索引和SQL Server中的其他各种事情有关。technet有一篇关于如何优化批量插入的文章,这篇文章揭示了批量是如何更快的。但我不能链接超过两次,所以你将不得不谷歌“优化批量导入性能”。
https://stackoverflow.com/questions/44041143
复制相似问题