一尘不染

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

sql

我正在写有关将数据从文件导入SQLServer表的方法的毕业论文。我已经创建了自己的程序,现在将其与一些标准方法进行比较,例如bcp,BULKINSERT,INSERT … SELECT * FROM OPENROWSET(BULK
…)等。我的程序从源文件中逐行读取,解析它们并使用普通INSERT一对一地导入它们。该文件包含100万行,每行4列。现在,我的程序需要160秒,而标准方法需要5-10秒。

那么问题来了,为什么批量操作会更快?他们使用特殊手段还是什么?您能解释一下还是给我一些有用的链接或其他东西?


阅读 185

收藏
2021-03-17

共1个答案

一尘不染

BULK
INSERT可以是最少记录的操作(取决于各种参数,例如索引,表上的约束,数据库的恢复模型等)。最少记录的操作仅记录分配和释放。在批量插入的情况下,仅记录扩展区分配,而不插入实际的数据。这将提供比INSERT好得多的性能。

比较批量插入与插入

实际的好处是减少了事务日志中记录的数据量。
如果是“批量记录”或“简单”恢复模型,则优势非常明显。

优化大容量导入性能

您还应该考虑阅读以下答案:插入表select * from table
vs批量插入

顺便说一下,有一些因素会影响BULK INSERT的性能:

该表是否具有约束或触发器,或两者兼有。

数据库使用的恢复模型。

将数据复制到的表是否为空。

该表是否具有索引。

是否指定了TABLOCK。

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

是否在运行SQL Server的两台计算机之间复制数据。

2021-03-17