国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C# - C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

2021-12-14 13:52鄒瓊俊 C#

這篇文章主要為大家詳細(xì)介紹了C#批量插入數(shù)據(jù)到Sqlserver中的三種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本篇,我將來講解一下在sqlserver中批量插入數(shù)據(jù)。

先創(chuàng)建一個(gè)用來測(cè)試的數(shù)據(jù)庫和表,為了讓插入數(shù)據(jù)更快,表中主鍵采用的是guid,表中沒有創(chuàng)建任何索引。guid必然是比自增長(zhǎng)要快的,因?yàn)槟闵梢粋€(gè)guid算法所花的時(shí)間肯定比你從數(shù)據(jù)表中重新查詢上一條記錄的id的值然后再進(jìn)行加1運(yùn)算要少。而如果存在索引的情況下,每次插入記錄都會(huì)進(jìn)行索引重建,這是非常耗性能的。如果表中無可避免的存在索引,我們可以通過先刪除索引,然后批量插入,最后再重建索引的方式來提高效率。

?
1
2
3
4
5
6
7
8
9
create database carsys;
go
use carsys;
go
create table product(
id uniqueidentifier primary key,
name varchar(50) not null,
price decimal(18,2) not null
)

我們通過sql腳本來插入數(shù)據(jù),常見如下三種方式。

方式一,一條一條插入,性能最差,不建議使用。

?
1
2
3
insert into product(id,name,price) values(newid(),'牛欄1段',160);
insert into product(id,name,price) values(newid(),'牛欄2段',260);
......

方式二

?
1
2
3
4
insert into product(id,name,price) values
(newid(),'牛欄1段',160)
,(newid(),'牛欄2段',260)
......

方式三

?
1
2
3
4
5
6
insert into product(id,name,price)
 select newid(),'牛欄1段',160
 union all
 select newid(),'牛欄2段',180
 union all
......

 在c#中通過ado.net來實(shí)現(xiàn)批量操作同樣也存在三種方式。

方式一:逐條插入

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static void insertone()
 {
  console.writeline("采用一條一條插入的方式實(shí)現(xiàn)");
  stopwatch sw = new stopwatch();
  long totalrow = 1000000;
 
  using (sqlconnection conn = new sqlconnection(strconnmsg)) //using中會(huì)自動(dòng)open和close 連接。
  {
   string sql = "insert into product(id,name,price) values(newid(),@p,@d)";
   conn.open();
   for (int i = 0; i < 1000000; i++)
   {
    using (sqlcommand cmd = new sqlcommand(sql, conn))
    {
 
     cmd.parameters.addwithvalue("@p", "商品" + i);
     cmd.parameters.addwithvalue("@d", i);
     sw.start();
     cmd.executenonquery();
 
     console.writeline(string.format("插入1條記錄,時(shí)間:{0}", sw.elapsedmilliseconds));
    }
    if (i == 1000)
    {
     sw.stop();
     break;
    }
   }
  }
  console.writeline(string.format("插入{0}條記錄,每1000條的插入時(shí)間是{1}毫秒,預(yù)估總得插入時(shí)間是{2}毫秒,{3}分鐘", totalrow, sw.elapsedmilliseconds,
((sw.elapsedmilliseconds / 1000) * totalrow), getminute((sw.elapsedmilliseconds / 1000 * totalrow))));
 }

運(yùn)行結(jié)果如下:

C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

我們會(huì)發(fā)現(xiàn)插入100w條記錄,預(yù)計(jì)需要50分鐘時(shí)間,每插入一條記錄大概需要3毫秒左右。

方式二:使用sqlbulk

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#region 方式二
static void inserttwo()
{
 console.writeline("使用bulk插入的實(shí)現(xiàn)方式");
 stopwatch sw = new stopwatch();
 datatable dt = gettableschema();
 
 using (sqlconnection conn = new sqlconnection(strconnmsg))
 {
  sqlbulkcopy bulkcopy = new sqlbulkcopy(conn);
  bulkcopy.destinationtablename = "product";
  bulkcopy.batchsize = dt.rows.count;
  conn.open();
  sw.start();
 
  for (int i = 0; i < totalrow;i++ )
  {
   datarow dr = dt.newrow();
   dr[0] = guid.newguid();
   dr[1] = string.format("商品", i);
   dr[2] = (decimal)i;
   dt.rows.add(dr);
  }
   if (dt != null && dt.rows.count != 0)
   {
    bulkcopy.writetoserver(dt);
    sw.stop();
   }
   console.writeline(string.format("插入{0}條記錄共花費(fèi){1}毫秒,{2}分鐘", totalrow, sw.elapsedmilliseconds, getminute(sw.elapsedmilliseconds)));
 }
}
static datatable gettableschema()
{
 datatable dt = new datatable();
 dt.columns.addrange(new datacolumn[] {
new datacolumn("id",typeof(guid)),
new datacolumn("name",typeof(string)),
new datacolumn("price",typeof(decimal))});
 return dt;
}
#endregion

運(yùn)行結(jié)果如下:

C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

插入100w條記錄才8s多,是不是很溜。

方式三:使用tvps(表值參數(shù))插入數(shù)據(jù)

從sqlserver 2008起開始支持tvps。創(chuàng)建緩存表producttemp ,執(zhí)行如下sql。

?
1
2
3
4
5
create type producttemp as table(
id uniqueidentifier primary key,
name varchar(50) not null,
price decimal(18,2) not null
)

執(zhí)行完成之后,會(huì)發(fā)現(xiàn)在數(shù)據(jù)庫carsys下面多了一張緩存表producttemp

C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

可見插入100w條記錄共花費(fèi)了11秒多。

總結(jié):大數(shù)據(jù)批量插入方式一盡量避免使用,而方式二和方式三都是非常高效的批量插入數(shù)據(jù)方式。其都是通過構(gòu)建datatable的方式插入的,而我們知道datatable是存在內(nèi)存中的,所以當(dāng)數(shù)據(jù)量特別特別大,大到內(nèi)存中無法一次性存儲(chǔ)的時(shí)候,可以分段插入。比如需要插入9千萬條數(shù)據(jù),可以分成9段進(jìn)行插入,一次插入1千萬條。而在for循環(huán)中直接進(jìn)行數(shù)據(jù)庫操作,我們是應(yīng)該盡量避免的。每一次數(shù)據(jù)庫的連接、打開和關(guān)閉都是比較耗時(shí)的,雖然在c#中存在數(shù)據(jù)庫連接池,也就是當(dāng)我們使用using或者conn.close(),進(jìn)行釋放連接時(shí),其實(shí)并沒有真正關(guān)閉數(shù)據(jù)庫連接,它只是讓連接以類似于休眠的方式存在,當(dāng)再次操作的時(shí)候,會(huì)從連接池中找一個(gè)休眠狀態(tài)的連接,喚醒它,這樣可以有效的提高并發(fā)能力,減少連接損耗。而連接池中的連接數(shù),我們都是可以配置的。

源碼下載:https://pan.baidu.com/s/1slkrrlr

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/jiekzou/p/6145550.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 色毛片| 成人涩涩日本国产一区 | 国产精品高清在线 | 成人在线免费观看 | 国产精品ssss在线亚洲 | 免费黄色电影在线观看 | 男女爱爱免费视频 | 日韩av免费在线观看 | 亚洲专区 中文字幕 | av在线免费观看网址 | 久久午夜精品 | 国产成人精品a视频一区www | 三级黄色片在线免费观看 | 91精品国产91久久久久久吃药 | 亚洲毛片一区二区 | 一区二区三区高清不卡 | 91.成人天堂一区 | 日本不卡高字幕在线2019 | 亚洲国产人午在线一二区 | 亚洲成人久久久 | 欧美一级一区 | 91精品国产综合久久久久久丝袜 | 激情五月婷婷 | 婷婷久久综合 | 欧美精品亚洲精品日韩精品 | 亚洲成人精品一区 | 色九九| 精品久久久久久久久久久久久久 | 久久国产成人 | 黄色av免费| 亚洲视频自拍 | www.av在线播放 | 99久久久久久 | 欧美精三区欧美精三区 | 婷婷综合久久 | 在线播放国产一区二区三区 | 在线观看精品91福利 | www.成人.com | 日本黄色大片免费看 | 自拍偷拍第一页 | 亚洲乱码日产精品一二三 |