c# 海量資料瞬間插入到資料庫的方法
當我們在資料庫中進行大量的資料追加時,是不是經常因為資料量過大而苦惱呢?
而所謂的海量資料,一般也是上萬級的資料,比如我們要新增一百萬條資料,應該如何提高它的效率呢?
oracle資料庫:
普通肉墊式
什麼叫批量插入呢,就是一次性插入一批資料,我們可以把這批資料理解為乙個大的陣列,而這些全部只通過乙個sql來實現,而在傳統方式下,需要呼叫很多次的sql才可以完成,這就是著名的「陣列繫結」的功能。我們先來看一下傳統方式下,插入多行記錄的操作方式:
//設定乙個資料庫的連線串,
string connectstr =
"user id=scott;password=tiger;data source=";
oracleconnection conn =
new oracleconnection(connectstr);
oraclecommand command =
new oraclecommand();
command.connection = conn;
conn.open(); //
通過迴圈寫入大量的資料,這種方法顯然是肉墊
for (
int i =
0; i < recc; i++)
使用odp特性
//設定乙個資料庫的連線串
string connectstr =
"user id=scott;password=tiger;data source=";
oracleconnection conn =
new oracleconnection(connectstr);
oraclecommand command =
new oraclecommand();
command.connection = conn; //
到此為止,還都是我們熟悉的**,下面就要開始嘍
//這個引數需要指定每次批插入的記錄數
command.arraybindcount = recc; //
在這個命令列中,用到了引數,引數我們很熟悉,但是這個引數在傳值的時候
//用到的是陣列,而不是單個的值,這就是它獨特的地方
command.commandtext =
"insert into dept values(:deptno, :deptname, :loc)";
conn.open(); //
下面定義幾個陣列,分別表示三個字段,陣列的長度由引數直接給出
int deptno =
newint[recc];
string dname =
newstring[recc];
string loc =
newstring[recc]; //
為了傳遞引數,不可避免的要使用引數,下面會連續定義三個
//從名稱可以直接看出每個引數的含義,不在每個解釋了
oracleparameter deptnoparam =
new oracleparameter(
"deptno
", oracledbtype.int32);
deptnoparam.direction = parameterdirection.input;
deptnoparam.value = deptno;
command.parameters.add(deptnoparam);
oracleparameter deptnameparam =
new oracleparameter(
"deptname
", oracledbtype.varchar2);
deptnameparam.direction = parameterdirection.input;
deptnameparam.value = dname; command.parameters.add(deptnameparam);
oracleparameter deptlocparam =
new oracleparameter(
"loc
", oracledbtype.varchar2);
deptlocparam.direction = parameterdirection.input;
deptlocparam.value = loc;
command.parameters.add(deptlocparam); //
在下面的迴圈中,先把陣列定義好,而不是像上面那樣直接生成sql
for (
int i =
0; i < recc; i++)
//這個呼叫將把引數陣列傳進sql,同時寫入資料庫
command.executenonquery();
好了,到目前為止,兩種方式的插入操作程式已經完成,就剩下對比了。我在主函式處寫了乙個小函式,迴圈多次對兩個方法進行呼叫,並且同時記錄下時間,對比函式如下:
for (
int i =
1; i <=
50; i++)
當資料量達到100萬級別時,所用時間依然令人滿意,最快一次達到890毫秒,一般為1秒左右。
經過試驗,得出一組資料,可以看出兩種方式在效率方面驚人的差距(占用時間的單位為毫秒),部分資料如下:
看一下由此資料生成的散點圖:
其中有些資料有些跳躍,可能和資料庫本身有關係,但是大部分資料已經能說明問題了。看了這些資料後,是不是有些心動了?
sqlserver資料庫
:既然oracle可以如此爽快,那麼在sqlserver中是否也可以這樣做呢?
但是在sqlserver中卻沒有諸如arraybindcount 這樣的操作屬性。
不過,我們卻可以借助於
bulk insert
來進入海量資料的新增。
**://設定乙個資料庫的連線串
string connectstr =
"……";
sqlconnection conn =
new sqlconnection(connectstr);
sqlcommand command =
new sqlcommand();
command.commandtimeout =
0; command.connection = conn; /*
說明:* 「c:\\sql.txt」是乙個預先生成的包含100條資料的檔案
* 每乙個欄位的資訊以「,」分割
* 每一條資料以「|」符號分隔
* 每10萬條資料乙個事務。
*/command.commandtext =
"bulk insert tableb from 'c:\\sql.txt' with (fieldterminator = ',',rowterminator ='|',batchsize = 100000)";
conn.open(); //
system.data.sqlclient.sqlbulkcopy sqlbc
command.executenonquery();
conn.close();
雖然比不上oracle那麼**,但是插入百萬條資料也不過只用了幾秒時間,比起我們平時的新增速度,無疑已經讓人非常興奮了吧,呵呵。
大家還不快試試去?
海量資料插入資料庫的快速方案
在我們開發專案過程中,一般都會遇到大批量的資料匯入。比如根據訂購日誌來生成訂購記錄。經過查詢資料發現了2種比較快速的方法 方法一 需要對日誌檔案做解析出來的。public class jdbcmorequick pstmt.executebatch conn.commit pstmt.close c...
ThinkPhp插入資料到資料庫
首先我們在home view目錄下建立乙個add資料夾,然後在add資料夾中建立乙個add.html檔案 我們需在這個檔案中是建立乙個簡單表單,對應我們資料表中的字段 html lang en 在我的資料thinkphp資料庫中有think form資料表,表中的字段為 id,title 第二步 建...
C 查詢和插入資料到sql資料庫
連線sql資料庫步驟 1.vs10 tools connect to database microsoft sql server 填寫server name use sql server authentication 常用方式 select or enter a database name ok 2...