2009年11月5日 星期四

BULK Insert

當你有大量的文字檔要輸入到 SQL Server 的資料表時,可以使用 BULK Insert 指令來完成,
且其效能會比一筆一筆 insert into 來的好。

舉例來說,你有個文字檔,其內容如下:

===== list.txt ====
李志堅,aa@3probe.com.tw
馮世華,bb@3probe.com.tw
洪崇富,cc@3probe.com.tw


測試資料表:
CREATE TABLE [dbo].[BULKTest](
 [BName] [nvarchar](50) NULL,
 [BMail] [nvarchar](100) NULL
) 

在 SQL 下,就可以執行以下指令來匯入資料到DB
BULK insert BULKTest from 'C:\MailList.txt' WITH (FIELDTERMINATOR = ',')

為了實際比較效能,另外寫了一段程式來比較:
declare @count int
set @count=0
while @count<100000
begin
insert into BULKTest (BName,BMail) values (N'李志堅','aa@3probe.com.tw')
set @count=@count+1
end
同時也將 MailList.txt 資料比數複製到100000筆,其所花費時間(秒)的結果是 2:23 真的在大量資料的環境下,使用 BULK Insert 是有利可圖的。 另外也實際測試了一下 BULK Insert 的資料來源是否可以支援網路磁碟,

BULK insert BULKTest from '\\GroupServer\share\test\MailList.txt' WITH (FIELDTERMINATOR = ',')

 結果是正常的。 如果您的資料量是好幾G以上的,建議可以參考一下「黑暗執行緒」的一篇 BULK INSERT Performance, 他提到有關 Log 資料增長的問題,因為大量新增資料後,留下的 Log 紀錄可能會灌暴硬碟空間,裡面介紹 一些參數與設定,讓你在使用 BULK Insert 時不留下 Log。 綜整所謂完美範本如下以茲盜拷:

BULK INSERT BULKTest
FROM 'C:\MailList.txt'
WITH
(
    BATCHSIZE = 1000,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    TABLOCK
)


參考資料:Using BULK INSERT to Load a Text File

沒有留言:

張貼留言