Sql-Server-2005
BCP 在最後一個“發送到 SQL Server 的 1000 行。發送的總數:…”之後停止
我像這樣執行 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 及更高版本: