面對 200 萬筆以上資料匯入需求,逐筆 INSERT 耗時數小時不可接受。BCP 雖快但為命令列工具,整合性差。BULK INSERT 結合高速度與 T-SQL 可程式性,測試 100 萬筆匯入僅需 20 秒內,是關聯式資料庫內建最強方案。本文詳細說明語法、參數、日誌模式切換技巧與實戰注意事項。
-- 1. 切換至大量記錄復原模式,減少記錄檔膨脹
ALTER DATABASE Taxi SET RECOVERY BULK_LOGGED;
-- 2. 執行大量匯入
BULK INSERT Taxi..Detail
FROM 'E:\Out.txt'
WITH (
DATAFILETYPE = 'char',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
);
-- 3. 還原完整復原模式
ALTER DATABASE Taxi SET RECOVERY FULL;
| 參數 | 說明 |
|---|---|
| DATAFILETYPE | char、widechar、native、widenative,對應檔案編碼 |
| FIELDTERMINATOR | 欄位分隔符,CSV 常用 ',' |
| ROWTERMINATOR | 列分隔符,Windows 為 '\n' 或 '\r\n' |
| TABLOCK | 取得資料表層級鎖定,大幅提升匯入速度,並允許最小化記錄 |
| BATCHSIZE | 每批次筆數,預設全檔;大檔案建議 50000~100000 平衡記憶體與交易記錄 |
| MAXERRORS | 容許錯誤筆數,預設 10,設 0 表示零容忍 |
| FIRSTROW / LASTROW | 跳過標題列或僅匯入特定區間 |
TABLOCK 會阻塞其他存取。→ 離峰時段執行,或先匯入暫存表再 SWITCH 分區。BULK_LOGGED 模式仍記錄配頁資訊。→ 結合 TABLOCK 達到最小化記錄;若資料庫為簡單復原模式則自動最小化。若需逐列驗證(如 FK 檢核、業務規則),可:
BULK INSERT 至暫存表(HEAP 無索引最快)。MERGE 或 INSERT...SELECT 搭配 WHERE NOT EXISTS 寫入正式表,錯誤導向錯誤表。| 模式 | 耗時 | 記錄檔增長 |
|---|---|---|
| 單筆 INSERT | ~45 分鐘 | 極大 |
| BCP 命令列 | ~18 秒 | 最小(BULK_LOGGED + TABLOCK) |
| BULK INSERT (TABLOCK) | ~20 秒 | 最小 |
| SSIS Flat File Source → OLE DB Destination (Fast Load) | ~25 秒 | 最小 |
DATAFILETYPE 一致HEAP 或叢集索引鍵與匯入順序一致TABLOCK 並切換復原模式