點滴記錄 批量新增資料(千萬級)方法

2022-09-16 01:21:08 字數 3969 閱讀 2611

bulk insert 海量新增資料語法

引數說明

database_name

指定的表或檢視所在的資料庫的名稱,如果未指定,則預設為當前資料庫。

schema_name

表或檢視架構的名稱。

table_name

要將資料大容量匯入其中的表或檢視的名稱。

『data_file』

資料檔案的完整路徑,該資料檔案包含到匯入到指定表或檢視中的資料。使用bulk insert可以從磁碟匯入資料。

batchsize=batch_size

指定批量處理中的行數。每個批處理作為乙個事物複製到伺服器。

check_constraints

指定在大容量匯入操作期間,必須檢查所有對目標表或檢視的約束。

fieldterminator ='field_terminator'

指定要用於 char 和 widechar 資料檔案的字段終止符,即字段的分隔符。 預設的字段終止符是 \t(製表符)。

rowterminator ='row_terminator'

指定要用於 char 和 widechar 資料檔案的行終止符,即行的分隔符。

更多引數說明,請參考: 

簡單示例

為了對比bulk insert和普通逐條插入的差異,我們通過乙個簡單的示例,通過實際執行來檢視效果。  

第一步:在資料庫新建兩張一樣的表,分表為student和student1,表結構完全相同,只有id,name,age三個簡單的字段。

第二步:新建乙個控制台程式,通過乙個簡單的迴圈,生成500000條資料寫入到txt檔案中,關鍵**如下:  

/// /// 生成測試資料

///

private static void generatetestdata()

,'test',|", i);

i++;}}

第三步:封裝出兩個方法,分別用來執行批量插入和普通插入,具體**如下:

/// /// 批量插入測試

///

private static void bulkinserttest()

from '' with (fieldterminator = ',',rowterminator ='|',batchsize = 50000)", strtablename, strfilepath);

dbhelper dbhelper = new dbhelper();

dbhelper.excute(sql);

}/// /// 普通插入測試

///

private static void commoninserttest()

,'test',)", i);

new dbhelper().excute(sqlinsert);

i++;}}

第四步:main主函式中呼叫批量插入和普通插入方法,並通過stopwatch計算出執行時間,pragram完整**如下:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

using qyh.blukinserttest.filemange;

using qyh.blukinserttest.database;

using system.diagnostics;

namespace qyh.blukinserttest

catch (exception)

stopwatch.stop();

string strresult = "批量插入耗時:" + stopwatch.elapsedmilliseconds.tostring();

stopwatch stopwatch1 = stopwatch.startnew();

commoninserttest();

stopwatch1.stop();

string str1result = "普通插入耗時:" + stopwatch1.elapsedmilliseconds.tostring();

string strtestresult = "result";

file.writetextasync(strresult + "\r\n" + str1result, strtestresult);

}/// /// 批量插入測試

///

private static void bulkinserttest()

from '' with (fieldterminator = ',',rowterminator ='|',batchsize = 50000)", strtablename, strfilepath);

dbhelper dbhelper = new dbhelper();

dbhelper.excute(sql);

}/// /// 普通插入測試

///

private static void commoninserttest()

,'test',)", i);

new dbhelper().excute(sqlinsert);

i++;}}

/// /// 生成測試資料

///

private static void generatetestdata()

,'test',|", i);

i++;}}

}}

示例中還用到兩個輔助類,dbhelper.cs和file.cs,由於僅用於演示,所以寫的非常簡單,其中檔案路徑是寫死的,可以替換成實際路徑。

dbhelper.cs 

using system;

using system.collections.generic;

using system.data.sqlclient;

using system.linq;

using system.text;

using system.threading.tasks;

namespace qyh.blukinserttest.database}}

file.cs

using system;

using system.collections.generic;

using system.io;

using system.linq;

using system.text;

using system.threading.tasks;

namespace qyh.blukinserttest.filemange}}

}}

一切準備就緒,開始執行,結果如下:

其中單位為毫秒,從結果我們可以看出bulk inser插入500000條資料還不需要3秒,而普通逐條插入卻需要20多分鐘

再加一點,我最近試了試,會出現字元轉換的問題,可以把字段都該成為字串的,這個主要是為了測試用,加入一條一條的插入1000萬條最少也要20分鐘左右吧,使用這個的話就比較迅速了,轉換完成後一般儲存的是這個型別看圖,需要改為選中的那個!!如果有幫助可點個贊。

Sqlite批量新增資料

今天遇到了往sqlite資料庫裡插入1400多條資料的情況,結果每次都需要一兩分鐘才能完成.搜尋了一下,在這裡找到了解決辦法,所需要的時間直接變成不到2秒 internal static void fastinsertmany dbconnection cnn dbtrans.commit catc...

PHP批量新增資料

連線資料庫 header content type text html charset utf 8 define db host 127.0.0.1 define db user root define db pass root define db name test define db port ...

大批量新增資料

這篇文章主要介紹了php大批量插入資料庫的3種方法和速度對比,3種方法分別使用普通insert語句 insert into語句和事務提交,需要的朋友可以參考下 第一種方法 使用insert into 插入,如下 params array value 50 set time limit 0 echo ...