BCP 在最后一个“1000 行发送到 SQL Server 后停止。发送的总数:...”

End*_*ono 7 sql-server-2005 bulkcopy

我像这样运行 SQL Server 2005 的批量复制程序 BCP:

bcp mydb.dbo.mytbl in myfile.blk -c -S mysvr -U mylogin -P mypass
Run Code Online (Sandbox Code Playgroud)

它运行并产生如下输出:

Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
...
1000 rows sent to SQL Server. Total sent: 55000
Run Code Online (Sandbox Code Playgroud)

但后来它停止了。光标没有返回提示,我没有收到“...行已复制”。信息。

我尝试查询目标表,我已经可以看到我想要导入的行。

我要终止控制台吗?会回滚吗?

Pau*_*ite 2

该进程似乎挂起,因为尽管它已将所有数据发送到 SQL Server,但数据仅放置在排序缓冲区中 - 尚未到达目标表。

当表有索引时,SQL Server 在插入之前会将数据按所需的索引顺序排序。如果数据集很大、有很多索引,或者 SQL Server 没有足够的可用排序内存,则此过程可能会花费大量时间。索引和现有表数据的存在也会影响 SQL Server 使用优化的最小日志记录插入的能力。

如果没有最小日志记录的插入,插入过程(排序后)也会很慢,因为每行都完全记录在事务日志中(包括撤消插入以确保可恢复性所需的信息)。

可以指定多个 bcp 选项来帮助实现最少日志记录的插入。可能还需要其他措施,例如临时更改数据库的恢复模型以支持高效的批量操作。在插入之前删除非聚集索引并在插入之后重建它们通常也是最佳策略。

总结一个复杂主题的要点:

  • 使用支持最少日志记录插入的恢复模型
  • 指定TABLOCK提示(具体语法因插入方法而异)
  • 指定ORDER提示并确保数据源已按聚类键预先排序
  • 禁用触发器和约束
  • 如果可能的话加载到空表中

有关更多信息,请参阅:

优化批量插入性能和链接页面

对于 SQL Server 2008 及更高版本:

数据加载性能指南


归档时间:

查看次数:

3946 次

最近记录:

10 年,2 月 前