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

问题描述 投票:0回答:4

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

那么问题是为什么 BULK 操作更快?他们使用特殊手段吗?你能解释一下吗,或者给我一些有用的链接之类的?

sql sql-server performance sql-insert bulkinsert
4个回答
13
投票

BULK INSERT 可以是最少记录的操作(取决于各种 索引、表约束、恢复模型等参数 数据库等)。最少记录的操作仅记录分配 和重新分配。在 BULK INSERT 的情况下,只有范围分配是 记录而不是插入的实际数据。这将提供 性能比 INSERT 好得多。

比较批量插入与插入

实际的好处是减少事务日志中记录的数据量。
在 BULK LOGGED 或 SIMPLE 恢复模型的情况下,优势是显着的。

优化批量导入性能

您还应该考虑阅读这个答案:Insert into table select * from table vs bulk insert

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

表是否有约束或触发器,或两者都有。

数据库使用的恢复模型。

复制数据的表是否为空

表是否有索引

是否指定了TABLOCK

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

数据是否要在两台安装SQL的电脑之间复制 服务器正在运行。


0
投票

我想你可以在上面找到很多文章,只需搜索“为什么批量插入更快”。例如,这似乎是一个很好的分析:

https://www.simple-talk.com/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods/

通常,任何数据库对于单个插入都有很多工作:检查约束、构建索引、刷新到磁盘。这种复杂的操作可以在一次操作中进行多个操作时由数据库进行优化,而不是一个一个地调用引擎。


0
投票

首先,逐行插入并不是最优的。请参阅这篇文章关于集合逻辑和这篇文章关于将数据加载到 SQL Server 的最快方法。

其次,BULK导入针对大负载进行了优化。这与页面刷新、写入日志、索引和 SQL Server 中的各种其他事情有关。有一篇关于如何优化 BULK INSERTS 的 technet 文章,这阐明了 BULK 如何更快。但是我不能链接超过两次,所以你必须谷歌搜索“优化批量导入性能”。


0
投票

至少 20 年来,SQL Server(/Sybase 也是)DBA 和其他开发人员使用实用程序(批量复制)快速将大数据导入和导出 SQL Server,因为大多数人认为这是最快的方法。请查看此 MS 实用程序: https://learn.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver16

© www.soinside.com 2019 - 2024. All rights reserved.