关于大批量数据高效插入方法

发布:2010-12-02 17:35   点击1001次   评论:0

没事在这里发一下关于数据库大批量插入数据的效率对比,用ACCESS和MSSQL,数值是在本机测试,根据不同的环境和配置,数值可能会有较大差别,大家看个对比就行了,别精打细算了。
使用Insert into方法插入
数据库                插入数                花费时间(单位:ms)
Access                1000次                672
Access                10000次                5610

MSSQL                1000次                610
MSSQL                10000次                5579

速度基本差不多,同样在解析语法上花费了很多时间

使用Addnew方法插入
数据库                插入数                花费时间(单位:ms)
Access                1000次                187
Access                10000次                1172

MSSQL                1000次                828
MSSQL                10000次                6719

速度明显有差距了,按道理说MSSQL速度应该比较快的,可能是因为MSSQL的LOG造成的影响吧


使用事务进行插入的效率对比

使用事务进行Insert into方法插入
数据库                插入数                花费时间(单位:ms)
Access                1000次                563
Access                10000次                4625

MSSQL                1000次                281
MSSQL                10000次                2183

使用事务的话,ACCESS与MSSQL的速度都有明显提高,但是MSSQL提高更突出

使用事务进行Addnew方法插入
数据库                插入数                花费时间(单位:ms)
Access                1000次                188
Access                10000次                1187

MSSQL                1000次                469
MSSQL                10000次                3875

看得出来,Access在使用事务情况下,Insert into效率提高还是比较明显,但是Addnew基本上变,原因可能是Addnew本身就是一种预解析模式,在整个插入过程中不需要语法解析,事务的批量提交优势也就没那么大了

最后来测试一下MSSQL的存储过程

不使用事务进行插入
数据库                插入数                花费时间(单位:ms)
MSSQL                1000次                375
MSSQL                10000次                3547

使用事务进行插入
数据库                插入数                花费时间(单位:ms)
MSSQL                1000次                187
MSSQL                10000次                1265

结果很明显,使用MSSQL进行大数据量插入,最好使用事务功能,这样效率提高一倍多。
使用Insert Into无论是ACCESS还是MSSQL效率都是一样慢,但是MSSQL用事务的话,效率还可以接受,ACCESS就不行了。
使用Addnew进行插入,ACCESS最适合这种方式,无论使不使用事务,效率差距不大,但是MSSQL就不建议这种方式了,怎么搞MSSQL在Addnew插入效率都很低。

综合以上考虑,在插入效率最高的要求下,ACCESS使用带事务的Addnew插入,MSSQL则使用带事务的存储过程

====================================================

我今天也测试了一下SQL Server,导入1000条数据,使用AddNew的方式,需要1263毫秒,beginTrans和没有beginTrans没有发现区别。使用Insert语句需要3000毫秒左右,beginTrans同样没有发挥作用。
设置rs的LockType = 4后,addNew1000条数据,终于达到了150毫秒左右。
rs.LockType=4后,需要使用updateBatch才能写入数据库,而且,执行updateBatch的时间比较长,好像速度并未得到明显提升。

====================================================




Demo:


var con = new ActiveXObject("ADODB.Connection");
con.Open("Provider=SQLOLEDB.1;Data Source=xxxx;Password=xxx;User ID=xx;Initial Catalog=dbName");

var cmm = new ActiveXObject("ADODB.Command");
cmm.ActiveConnection = con;
cmm.CommandType   = 1;
cmm.Prepared   = true;
cmm.CommandText = "INSERT INTO test(intValue,strValue,floatValue,textValue,datetimeValue,bitValue) VALUES(?, ?, ?, ?, ?, ?)";
cmm.Parameters.Append(cmm.CreateParameter("", 3  , 1, -1));
cmm.Parameters.Append(cmm.CreateParameter("", 202, 1, -1));
cmm.Parameters.Append(cmm.CreateParameter("", 4  , 1, -1));
cmm.Parameters.Append(cmm.CreateParameter("", 203, 1, -1));
cmm.Parameters.Append(cmm.CreateParameter("", 135, 1, -1));
cmm.Parameters.Append(cmm.CreateParameter("", 11 , 1, -1));
 
var intValue = 1;
var strValue = "文字啊啊";
var floatValue = 1.1;
var txtValue = "长文本啊啊.......";
var datValue = new Date().getVarDate();
var blnValue = true;

var sTime = new Date().getTime();
var flag;
for (var i=0; i<1000; i++) {
 cmm.Parameters.Item(0).Value = intValue;
 cmm.Parameters.Item(1).Value = strValue;
 cmm.Parameters.Item(2).Value = floatValue;
 cmm.Parameters.Item(3).Value = txtValue;
 cmm.Parameters.Item(4).Value = datValue;
 cmm.Parameters.Item(5).Value = blnValue;
 cmm.Execute();
}
WScript.Echo(new Date().getTime() - sTime);   // 828 ms

con.Close();
con = cmm = null;

var intValue = 1;
var strValue = "文字啊啊";
var floatValue = 1.1;
var txtValue = "长文本啊啊.......";
var datValue = new Date().getVarDate();
var blnValue = true;

 

var rs = new ActiveXObject("ADODB.Recordset");
rs.Open("select top 1 * from test", con, 1, 3);

var sTime = new Date().getTime();
for (var i=0; i<1000; i++) {
 rs.AddNew();
 rs.Fields("intValue").Value  = intValue;
 rs.Fields("strValue").Value  = strValue;
 rs.Fields("floatValue").Value = floatValue;
 rs.Fields("textValue").Value = txtValue;
 rs.Fields("datetimeValue").Value= datValue;
 rs.Fields("bitValue").Value  = blnValue;
 rs.Update();
}
WScript.Echo(new Date().getTime() - sTime); // 1718 ms
rs.Close();


Peace Test :
x: 平常 DoSql(conn,sql)
y: 使用事务 Insert into
z: 使用事务 Addnew

 ::: Report :::   3873+1
    x----     y----      z----
 62.0312    --.----    64.2812
 64.0312    --.----    57.7187
 55.0625    --.----    59.4687

 ::: RepItem :::  4975+1169
    x----     y----      z----
  79.6875   72.7031    59.6093
 114.8594   70.5625    59.0468
  69.4687   78.9843    56.5937

 ::: RepRes :::   20615+65
    x----     y----      z----
291.1406    --.----   198.8438
 

关于 GitHub 导航 部门 反馈

提示:`/home.php`入口数据仅为演示功能,不构成任何交易凭证,也不承担相关风险和责任!

Copyright © 2011-2018 xxxxx.com All rights reserved.

Run:34.953/64.173(ms); 7(sql)/2.905(MB); comm:news/detail; Upd:2024-05-05 20:08:29