在sql server 中插入一條資料使用insert語句,但是如果想要批量插入一堆資料的話,迴圈使用insert不僅效率低,而且會導致sql一系統效能問題。下面介紹sql server支援的兩種批量資料插入方法:bulk和錶值引數(table-valued parameters)。
執行下面的指令碼,建立測試
資料庫和錶值引數。
--create databasecreate 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 = newstopwatch();
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中的資料插入到資料庫
**如下:
publicstatic
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 copypublic
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 執行下面的指令碼,...