我正在写关于将数据从文件导入 SQL Server 表的方法的毕业论文。我已经创建了自己的程序,现在我将它与一些标准方法进行比较,例如 bcp、BULK INSERT、INSERT ... SELECT * FROM OPENROWSET(BULK...) 等。我的程序从源文件中读取行,解析它们并使用普通的 INSERT 将它们一一导入。该文件包含 100 万行,每行 4 列。现在我的情况是我的程序需要 160 秒,而标准方法需要 5-10 秒。
那么问题是为什么 BULK 操作更快?他们使用特殊手段吗?你能解释一下吗,或者给我一些有用的链接之类的?
BULK INSERT 可以是最少记录的操作(取决于各种 索引、表约束、恢复模型等参数 数据库等)。最少记录的操作仅记录分配 和重新分配。在 BULK INSERT 的情况下,只有范围分配是 记录而不是插入的实际数据。这将提供 性能比 INSERT 好得多。
实际的好处是减少事务日志中记录的数据量。
在 BULK LOGGED 或 SIMPLE 恢复模型的情况下,优势是显着的。
您还应该考虑阅读这个答案:Insert into table select * from table vs bulk insert
顺便说一句,有一些因素会影响 BULK INSERT 性能:
表是否有约束或触发器,或两者都有。
数据库使用的恢复模型。
复制数据的表是否为空
表是否有索引
是否指定了TABLOCK
数据是从单个客户端复制还是复制到 来自多个客户端的并行。
数据是否要在两台安装SQL的电脑之间复制 服务器正在运行。
我想你可以在上面找到很多文章,只需搜索“为什么批量插入更快”。例如,这似乎是一个很好的分析:
通常,任何数据库对于单个插入都有很多工作:检查约束、构建索引、刷新到磁盘。这种复杂的操作可以在一次操作中进行多个操作时由数据库进行优化,而不是一个一个地调用引擎。
至少 20 年来,SQL Server(/Sybase 也是)DBA 和其他开发人员使用实用程序(批量复制)快速将大数据导入和导出 SQL Server,因为大多数人认为这是最快的方法。请查看此 MS 实用程序: https://learn.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver16