我像这样运行 SQL Server 2005 的大容量复制程序 BCP:
bcp mydb.dbo.mytbl in myfile.blk -c -S mysvr -U mylogin -P mypass
它运行并产生如下输出:
Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
...
1000 rows sent to SQL Server. Total sent: 55000
但随后它停止了。光标没有返回提示,我没有收到“...行已复制”。信息。
我尝试查询目标表,我已经可以看到我想要导入的行。
我要终止控制台吗?会回滚吗?
3小时后,我终于得到了我的提示:
虽然我仍然不知道为什么它没有立即返回,因为已经插入了行。我最好的猜测是它进行了索引重建。
下次它像那样挂断时,我会尝试终止控制台。
该进程似乎挂起,因为尽管它已将所有数据发送到 SQL Server,但数据仅放置在排序缓冲区中 - 它尚未到达目标表。
当表有索引时,SQL Server 会在插入前将数据排序为所需的索引顺序。如果数据集很大、索引很多,或者 SQL Server 可用的排序内存不足,则此过程可能会花费大量时间。索引和现有表数据的存在也会影响 SQL Server 使用优化的最少日志记录插入的能力。
如果没有最少记录的插入,插入过程(排序后)也会很慢,因为每一行都完全记录在事务日志中(包括撤消插入以确保可恢复性所需的信息)。
可以指定几个 bcp 选项来帮助实现最少记录的插入。其他措施也可能是必要的,例如临时更改数据库的恢复模式以支持高效的批量操作。在插入之前删除非聚集索引并在之后重建它们通常也是最佳策略。
总结一个复杂主题的要点:
TABLOCK
提示(具体语法因插入方法而异)ORDER
提示并确保数据源按聚类键预先排序有关更多信息,请参阅:
优化批量插入性能和链接页面
对于 SQL Server 2008 及更高版本:
数据加载性能指南