Sql-Server-2005

BCP 在最後一個“發送到 SQL Server 的 1000 行。發送的總數:…”之後停止

  • September 1, 2015

我像這樣執行 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

但隨後它停止了。游標沒有返回提示,我沒有收到“…行已複製”。資訊。

我嘗試查詢目標表,我已經可以看到我想要導入的行。

我要終止控制台嗎?會回滾嗎?

該程序似乎掛起,因為儘管它已將所有數據發送到 SQL Server,但數據僅放置在排序緩衝區中 - 它尚未到達目標表。

當表有索引時,SQL Server 會在插入前將數據排序為所需的索引順序。如果數據集很大、索引很多,或者 SQL Server 可用的排序記憶體不足,則此過程可能會花費大量時間。索引和現有表數據的存在也會影響 SQL Server 使用優化的最少日誌記錄插入的能力。

如果沒有最少記錄的插入,插入過程(排序後)也會很慢,因為每一行都完全記錄在事務日誌中(包括撤消插入以確保可恢復性所需的資訊)。

可以指定幾個 bcp 選項來幫助實現最少記錄的插入。其他措施也可能是必要的,例如臨時更改數據庫的恢復模式以支持高效的批量操作。在插入之前刪除非聚集索引並在之後重建它們通常也是最佳策略。

總結一個複雜主題的要點:

  • 使用支持最少記錄插入的恢復模型
  • 指定TABLOCK提示(具體語法因插入方法而異)
  • 指定ORDER提示並確保數據源按分群鍵預先排序
  • 禁用觸發器和約束
  • 如果可能,載入到空表中

有關更多資訊,請參閱:

優化批量插入性能和連結頁面

對於 SQL Server 2008 及更高版本:

數據載入性能指南

引用自:https://dba.stackexchange.com/questions/31431