大資料處理方案之比較

2021-06-18 18:40:22 字數 3247 閱讀 6571

在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.訂閱資料庫,只可以查詢操作,這樣的話可以在這個表上面建立索引...