在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))
下面我們使用最簡單的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,所以我就手動強行停止了。
下面看一下使用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。
最後再看看使用錶值引數的效率,會另你大為驚訝的。
錶值引數是sql server 2008新特性,簡稱tvps。對於錶值引數不熟悉的朋友,可以參考最新的book online,我也會另外寫一篇關於錶值引數的部落格,不過此次不對錶值引數的概念做過多的介紹。言歸正傳,看**:
複製** **如下:
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秒。
大資料處理方案
假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。2 32為40億多,所以給定乙個數可能在,也可能不在其中 這裡我們把40億個...
大資料處理
大資料處理的流程主要包括以下四個環節 採集 匯入 預處理 統計 分析 挖掘,下面針對這四環節進行簡單闡述。大資料處理之一 採集 在大資料的採集過程中,其主要特點和挑戰是併發數高,因為同時有可能會有成千上萬的使用者來進行訪問和操作,比如火車票售票 和 它們併發的訪問量在峰值時達到上百萬,所以需要在採集...
大資料處理隨筆
1.mssql當資料庫資料超過1000萬的時候超時是正常的,所以當表資料到1000萬時候注意delete 2.今天遇到資料庫時間格式2014021000 當然是int型別哦 3.聯合索引使用 開始時間與結束時間這樣一起查詢的要建成索引 4.訂閱資料庫,只可以查詢操作,這樣的話可以在這個表上面建立索引...