我正在写有关将数据从文件导入SQLServer表的方法的毕业论文。我已经创建了自己的程序,现在将其与一些标准方法进行比较,例如bcp,BULKINSERT,INSERT … SELECT * FROM OPENROWSET(BULK …)等。我的程序从源文件中逐行读取,解析它们并使用普通INSERT一对一地导入它们。该文件包含100万行,每行4列。现在,我的程序需要160秒,而标准方法需要5-10秒。
那么问题来了,为什么批量操作会更快?他们使用特殊手段还是什么?您能解释一下还是给我一些有用的链接或其他东西?
BULK INSERT可以是最少记录的操作(取决于各种参数,例如索引,表上的约束,数据库的恢复模型等)。最少记录的操作仅记录分配和释放。在批量插入的情况下,仅记录扩展区分配,而不插入实际的数据。这将提供比INSERT好得多的性能。
比较批量插入与插入
实际的好处是减少了事务日志中记录的数据量。 如果是“批量记录”或“简单”恢复模型,则优势非常明显。
优化大容量导入性能
您还应该考虑阅读以下答案:插入表select * from table vs批量插入
顺便说一下,有一些因素会影响BULK INSERT的性能:
该表是否具有约束或触发器,或两者兼有。 数据库使用的恢复模型。 将数据复制到的表是否为空。 该表是否具有索引。 是否指定了TABLOCK。 是从单个客户端复制数据还是从多个客户端并行复制数据。 是否在运行SQL Server的两台计算机之间复制数据。
该表是否具有约束或触发器,或两者兼有。
数据库使用的恢复模型。
将数据复制到的表是否为空。
该表是否具有索引。
是否指定了TABLOCK。
是从单个客户端复制数据还是从多个客户端并行复制数据。
是否在运行SQL Server的两台计算机之间复制数据。