有人可以解释一下 BULK INSERT 在内部是如何工作的,为什么它比正常的 INSERT 操作快得多?
问候,希希尔。
BULK INSERT 与 SQL Server 的数据库引擎在进程内运行,因此避免了通过客户端 API 的网络层传递数据 - 这使其比 BCP 和 DTS / SSIS 更快。
此外,使用 BULK INSERT,您可以指定数据的 ORDER BY,如果这与表的 PK 相同,则锁定发生在 PAGE 级别。对事务日志的写入也发生在页级别而不是行级别。
在常规 INSERT 的情况下,锁定和事务日志写入在行级别。这使得 BULK INSERT 比 INSERT 语句更快。
至少它可以避免为要插入的每条记录创建和提交事务的开销。还有其他节省:例如通过网络传输更大的数据块而不是一次一条记录会有所帮助。
然后,也许更有趣的是,数据库实现者可以(我不知道是否有任何特定供应商实际上这样做)开始变得聪明——他们可以查看要插入的记录集,而不是重新组织数据页面以适应单个记录可以对页面进行批量重组以允许新的插入,同样我们可以想象如果我们知道我们正在插入一组记录,可以更有效地完成洗牌索引。
在内部,它转换为 OLEDB 记录集,然后加载表。
我没有考虑太多,但我认为在 SQL Server 机器上运行而不是在客户端上运行会更快。另外,您可以管理普通 INSERT 无法管理的约束