C 海量資料瞬間插入到資料庫的方法

2021-09-30 10:12:07 字數 3648 閱讀 6465

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...