百萬級資料的批量插入的兩種方法測試

2021-09-07 18:12:44 字數 3814 閱讀 4723

在sql server 中插入一條資料使用insert語句,但是如果想要批量插入一堆資料的話,迴圈使用insert不僅效率低,而且會導致sql一系統效能問題。下面介紹sql server支援的兩種批量資料插入方法:bulk和錶值引數(table-valued parameters)。

執行下面的指令碼,建立測試

資料庫和錶值引數。

--create database  

create database bulktestdb;

go

use bulktestdb;

go

--create table

create table bulktesttable(

id int

primary key,

username nvarchar(

32),

pwd varchar(

16))

go

--create table valued

create type bulkudt as table

(id

int,

username nvarchar(

32),

pwd varchar(

16))

一、【ccc級】下面我們使用最簡單的insert語句來插入100萬條資料

**如下:

stopwatch sw = new

stopwatch();

sqlconnection sqlconn = new

sqlconnection(

configurationmanager.connectionstrings[

"connstr

"].connectionstring);//

連線資料庫

sqlcommand sqlcomm = new

sqlcommand();

sqlcomm.commandtext = string.format("

insert into bulktesttable(id,username,pwd)values(@p0,@p1,@p2)

");//

引數化sql

sqlcomm.parameters.add("

@p0"

, sqldbtype.int);

sqlcomm.parameters.add(

"@p1

", sqldbtype.nvarchar);

sqlcomm.parameters.add(

"@p2

", sqldbtype.varchar);

sqlcomm.commandtype =commandtype.text;

sqlcomm.connection =sqlconn;

sqlconn.open();

try", count *multiply);

sqlcomm.parameters[

"@p2

"].value = string.format("

pwd-

", count *multiply);

sw.start();

sqlcomm.executenonquery();

sw.stop();

} //每插入10萬條資料後,顯示此次插入所用時間

console.writeline(string.format("

elapsed time is milliseconds

", sw.elapsedmilliseconds));

} } catch

(exception ex)

finally

console.readline();

由於執行過慢,才插入10萬條就耗時72390 milliseconds,所以我就手動強行停止了。

二、【bbb級】下面看一下使用bulk插入的情況:

bulk方法主要思想是通過在客戶端把資料都快取在table中,然後利用sqlbulkcopy一次性把table中的資料插入到資料庫

**如下:

public

static

void

bulktodb(datatable dt)

catch

(exception ex)

finally

} public

static

datatable gettableschema()

);

return

dt;

}

static

void main(string

args)

", count *multiply);

r[2] = string.format("

pwd-

", count *multiply);

dt.rows.add(r);

} sw.start();

bulk.bulktodb(dt);

sw.stop();

console.writeline(

string.format("

elapsed time is milliseconds

", sw.elapsedmilliseconds));

} console.readline();

}

使用bulk後,效率和效能明顯上公升。使用insert插入10萬資料耗時72390,而現在使用bulk插入100萬資料才耗時17583。

三、【aaaa級】最後再看看使用錶值引數的效率,會另你大為驚訝的。

錶值引數是sql server 2008新特性,簡稱tvps。對於錶值引數不熟悉的朋友,可以參考最新的book online,我也會另外寫一篇關於錶值引數的部落格,不過此次不對錶值引數的概念做過多的介紹。言歸正傳,看**:

[c-sharp] view plain copy

public

static

void

tablevaluedtodb(datatable dt)

} catch

(exception ex)

finally

} public

static

datatable gettableschema()

);

return

dt;

}

static

void main(string

args)

", count *multiply);

r[2] = string.format("

pwd-

", count *multiply);

dt.rows.add(r);

} sw.start();

tablevalued.tablevaluedtodb(dt);

sw.stop();

console.writeline(

string.format("

elapsed time is milliseconds

", sw.elapsedmilliseconds));

} console.readline();

}

比bulk還快5秒。

百萬級資料的批量插入的兩種方法測試

在sql server 中插入一條資料使用insert語句,但是如果想要批量插入一堆資料的話,迴圈使用insert不僅效率低,而且會導致sql一系統效能問題。下面介紹sql server支援的兩種批量資料插入方法 bulk和錶值引數 table valued parameters 執行下面的指令碼,...

SQL Server 批量插入資料的兩種方法

在sql server 中插入一條資料使用insert語句,但是如果想要批量插入一堆資料的話,迴圈使用insert不僅效率低,而且會導致sql一系統效能問題。下面介紹sql server支援的兩種批量資料插入方法 bulk和錶值引數 table valued parameters 執行下面的指令碼,...

SQL Server 批量插入資料的兩種方法

在sql server 中插入一條資料使用insert語句,但是如果想要批量插入一堆資料的話,迴圈使用insert不僅效率低,而且會導致sql一系統效能問題。下面介紹sql server支援的兩種批量資料插入方法 bulk和錶值引數 table valued parameters 執行下面的指令碼,...