亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中使用ODP瞬間導入百萬級數據的方法

2023-05-11 12:02:25
字體:
來源:轉載
供稿:網友

.Net程序中可以通過ODP調用特性,對Oracle數據庫進行操作,今天來講一下數據批量插入的功能,所用技術不高不深,相信很多朋友都接觸過。

(1)普通肉墊式

什么叫批量插入呢,就是一次性插入一批數據,我們可以把這批數據理解為一個大的數組,而這些全部只通過一個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();

Stopwatch sw
= new
Stopwatch();

sw.Start();


//通過循環寫入大量的數據,這種方法顯然是肉墊


for (int i = 0; i < recc; i++)

{


string sql = "insert into dept values(" +
i.ToString()

+ "," + i.ToString() + "," + i.ToString() + ")"
;

command.CommandText
=
sql;

command.ExecuteNonQuery();

}

sw.Stop();

System.Diagnostics.Debug.WriteLine(
"普通插入:" +
recc.ToString()

+ "所占時間:" + sw.ElapsedMilliseconds.ToString());

我們先準備好程序,但是先不做時間的測定,因為在后面我們會用多次循環的方式來計算所占用的時間。

(2)使用ODP特性

看上面的程序,大家都很熟悉,因為它沒有用到任何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 = new int[recc];

string[] dname = new string
[recc];

string[] loc = new string
[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);

Stopwatch sw
= new
Stopwatch();

sw.Start();


//在下面的循環中,先把數組定義好,而不是像上面那樣直接生成SQL


for (int i = 0; i < recc; i++)

{

deptNo[i]
=
i;

dname[i]
=
i.ToString();

loc[i]
=
i.ToString();

}


//這個調用將把參數數組傳進SQL,同時寫入數據庫


command.ExecuteNonQuery();

sw.Stop();

System.Diagnostics.Debug.WriteLine(
"批量插入:" + recc.ToString()

+ "所占時間:" +sw.ElapsedMilliseconds.ToString());

 以上代碼略顯冗長,但是加上注釋后基本也就表達清楚了。

當數據量達到100萬級別時,所用時間依然令人滿意,最快一次達到890毫秒,一般為1秒左右。

好了,到目前為止,兩種方式的插入操作程序已經完成,就剩下對比了。我在主函數處寫了一個小函數,循環多次對兩個方法進行調用,并且同時記錄下時間,對比函數如下:

for (int i = 1; i <= 50; i++)

{

Truncate();

OrdinaryInsert(i
* 1000
);

Truncate();

BatchInsert(i
* 1000
);

}

 經過試驗,得出一組數據,可以看出兩種方式在效率方面驚人的差距(占用時間的單位為毫秒),部分數據如下:

記錄數

標準

批處理

1000

1545

29

2000

3514

20

3000

3749

113

4000

5737

40

5000

6820

52

6000

9469

72

7000

10226

69

8000

15280

123

9000

11475

83

10000

14536

121

11000

15705

130

12000

16548

145

13000

18765

125

14000

20393

116

15000

22181

159

因為篇幅原因,不再粘貼全部的數據,但是我們可以看一下由此數據生成的散點圖:

ODP導入百萬條數據

其中有些數據有些跳躍,可能和數據庫本身有關系,但是大部分數據已經能說明問題了??戳诉@些數據后,是不是有些心動了?

源程序放了一段時間直接拷貝貼過來了,可能需要調試一下才能跑通,不過不是本質性問題,對了如果要測試別忘記安裝Oracle訪問組件。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www国产精品com| 亚洲第一色中文字幕| 欧美精品一区三区| 国产成人免费av电影| 蜜臀久久99精品久久久无需会员| 亚洲色图综合久久| 色偷偷av一区二区三区| 欧美在线视频导航| 久久99精品视频一区97| 精品一区二区电影| 久久精品99久久香蕉国产色戒| 91免费视频网站| 欧美亚洲国产视频小说| 日韩在线观看高清| 亚洲色图综合网| 欧美人与性动交a欧美精品| 日韩成人在线视频网站| 亚洲日本欧美中文幕| 中文字幕亚洲天堂| 亚洲乱码一区av黑人高潮| 国产成+人+综合+亚洲欧洲| 日韩欧美亚洲成人| 日韩av在线最新| 97国产精品视频人人做人人爱| 国产在线观看不卡| 国产久一一精品| 亚洲成人精品在线| 成人在线中文字幕| 国产一区二区在线免费| 97精品国产91久久久久久| 中文.日本.精品| 亚洲自拍偷拍网址| 日韩亚洲欧美中文在线| 日韩中文娱乐网| 国产精品免费观看在线| 热久久美女精品天天吊色| 日韩经典中文字幕在线观看| 在线观看日韩视频| 欧美激情在线观看| 夜夜躁日日躁狠狠久久88av| 日韩成人激情影院| 91大神福利视频在线| 黄色成人在线免费| 成人精品久久av网站| 91啪国产在线| 狠狠躁夜夜躁久久躁别揉| 亚洲xxx视频| zzijzzij亚洲日本成熟少妇| 91精品国产综合久久香蕉| 国产精品久久久久久五月尺| 欧美精品videos| 日日狠狠久久偷偷四色综合免费| 国产精品久久久久久久一区探花| 91最新国产视频| 日韩中文字幕网| 中文字幕av一区二区| 日本成人在线视频网址| 91国自产精品中文字幕亚洲| 国产在线不卡精品| 久久久噜久噜久久综合| 日本精品在线视频| 亚洲免费影视第一页| 亚洲国产精品久久久久久| 亚洲国产精品女人久久久| 欧美日韩精品在线观看| 人九九综合九九宗合| 日韩欧美国产一区二区| 色综合久综合久久综合久鬼88| 中文字幕日韩av电影| 欧美麻豆久久久久久中文| 欧美在线不卡区| 国产欧美久久一区二区| 欧美大荫蒂xxx| 国产99久久精品一区二区 夜夜躁日日躁| 欧美成人中文字幕| 欧美一区在线直播| 久久99热这里只有精品国产| 秋霞成人午夜鲁丝一区二区三区| 国产日产久久高清欧美一区| 清纯唯美亚洲激情| 欧美亚洲国产精品| 美女啪啪无遮挡免费久久网站| 亚洲男人的天堂在线| 亚洲日本成人女熟在线观看| 久久久久久久香蕉网| 色婷婷亚洲mv天堂mv在影片| 亚洲аv电影天堂网| 在线视频免费一区二区| 丁香五六月婷婷久久激情| 欧美一级大片在线免费观看| 亚洲高清久久网| 精品国产欧美一区二区三区成人| 欧美性生交大片免网| 欧美丰满少妇xxxxx| 日韩在线视频一区| 午夜精品美女自拍福到在线| 日韩一区二区三区国产| 久热精品视频在线| 日韩电视剧免费观看网站| 亚洲天堂视频在线观看| 人人做人人澡人人爽欧美| 欧美一级在线播放| 精品国产乱码久久久久酒店| 久久五月天色综合| 91香蕉嫩草神马影院在线观看| 亚洲已满18点击进入在线看片| 91福利视频在线观看| 亚洲人在线观看| 亚洲欧洲在线免费| 亚洲天堂免费在线| 国产xxx69麻豆国语对白| 欧美精品激情在线| 日韩在线视频二区| 亚洲欧洲第一视频| 国产香蕉精品视频一区二区三区| 亚洲欧美日韩成人| 国产成人aa精品一区在线播放| 欧美小视频在线| 欧美刺激性大交免费视频| 日本三级韩国三级久久| 4444欧美成人kkkk| 国产精品久久一区主播| 国产精品成人免费视频| 丝袜情趣国产精品| 国产午夜精品视频免费不卡69堂| 久久中文字幕一区| xvideos亚洲| 欧美成人午夜激情在线| 91av视频在线| 欧美日本高清一区| 欧美日韩国产中文精品字幕自在自线| 欧美福利小视频| 91精品视频在线播放| 日韩在线免费高清视频| 日韩精品在线视频| 96国产粉嫩美女| 国产精品91一区| 啊v视频在线一区二区三区| 亚洲va电影大全| 久久全国免费视频| 91久久久久久久久久久| 最近2019中文字幕大全第二页| 亚洲自拍偷拍色图| 欧美高清理论片| 成人在线视频网站| 亚洲欧美成人网| 久久精品国产视频| 欧美视频中文字幕在线| 国产美女扒开尿口久久久| 国产在线不卡精品| 国产成人涩涩涩视频在线观看| 在线电影欧美日韩一区二区私密| 91性高湖久久久久久久久_久久99| 精品中文字幕久久久久久| 国内精品久久影院| 日韩在线一区二区三区免费视频| 色无极影院亚洲| 久久婷婷国产麻豆91天堂| 日韩av网址在线| 精品国产乱码久久久久久天美| 欧美小视频在线观看| 日韩资源在线观看| 久久69精品久久久久久久电影好| 国产在线观看一区二区三区|