前端之家收集整理的这篇文章主要介绍了
Oracle批量导入100万条数据不到1秒,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
.Net程序中可以通过ODP调用特性,对Oracle数据库进行操作,今天来讲一下数据批量插入的功能,所用技术不高不深,相信很多朋友都接触过,小弟班门弄斧了,呵呵。这篇文章是上篇文章的续集,因为上一次试验的征集结果没有突破4秒的方法,所以这次继续挑战与挖掘新方法,虽然是Oracle,但仍具有一定收藏意义。
上一次文章中提及的试验: SqlServer批量导入C#100万条数据仅4秒附源码http://www.jb51.cc/article/p-faxczxmd-bpr.html
这个试验是针对sql SERVER数据库的,宿主环境也是.Net,有兴趣的朋友可以将这两个试验对比一下,为日后工作批量导数提供支持。
另外,一些朋友对上次试验环境有些异议,认为应该对数据库和服务器做优化或设置,以体现试验最终的时间结果。这个固然会影响试验的时间结果,但考虑到在试验环境中,对数据库优化的标准与优化程度不便统一与定量,试验结果也不易说明其影响源,所以这次试验依然以标准数据库建库后的配置为主,试验所在服务器硬件环境与上次试验保持一致。实验目的在于挖掘、对比宿主程序中的数据批量操作方法。
有新方法提升性能时间指标的朋友,欢迎互相切磋,互相提高,嘴上功夫就免了。。。
好了正文开始。
● 普通肉垫式
什么叫批量插入呢,就是一次性插入一批数据,我们可以把这批数据理解为一个大的数组,而这些全部只通过一个sql来实现,而在传统方式下,需要调用很多次的sql才可以完成,这就是著名的“数组绑定”的功能。我们先来看一下传统方式下,插入多行记录的操作方式:
代码
@H_
301_31@
//
设置一个数据库的连接串,
string
connectStr
=
"
User Id=scott;Password=tiger;Data Source=
"
; OracleConnection conn
=
new
OracleConnection(connectStr); OracleCommand command
=
new
OracleCommand(); command.Connection
=
conn; conn.Open(); Stopwatch sw
=
new
Stopwatch(); sw.Start();
通过循环写入大量的数据,这种方法显然是肉垫
for
(
int
i
=
0
; i
<
recc; i
++
) {
string
sql
=
insert into dept values(
"
+
i.ToString()
+
,
)
"
; command.CommandText
=
sql; command.ExecuteNonQuery(); } sw.Stop(); System.Diagnostics.Debug.WriteLine(
普通插入:
"
+
recc.ToString()
+
所占时间:
"
+
sw.ElapsedMilliseconds.ToString());
设置一个
数据库的连接串
new
OracleCommand(); command.Connection
=
conn;
到此为止,还都是我们熟悉的代码,下面就要开始喽
这个参数需要指定每次批插入的记录数
command.ArrayBindCount
=
recc;
在这个命令行中,用到了参数,参数我们很熟悉,但是这个参数在传值的时候
用到的是数组,而不是单个的值,这就是它独特的地方
command.CommandText
=
insert into dept values(:deptno,:deptname,:loc)
"
; conn.Open();
下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出
int
[] deptNo
=
new
int
[recc];
string
[] dname
=
string
[recc];
string
[] loc
=
为了传递参数,不可避免的要使用参数,下面会连续定义三个
从名称可以直接看出每个参数的含义,不在每个解释了
OracleParameter deptNoParam
=
new
OracleParameter(
deptno
"
,OracleDbType.Int32); deptNoParam.Direction
=
ParameterDirection.Input; deptNoParam.Value
=
deptNo; command.Parameters.Add(deptNoParam); OracleParameter deptNameParam
=
deptname
=
ParameterDirection.Input; deptNameParam.Value
=
dname; command.Parameters.Add(deptNameParam); OracleParameter deptLocParam
=
loc
=
ParameterDirection.Input; deptLocParam.Value
=
loc; command.Parameters.Add(deptLocParam); Stopwatch sw
=
在下面的循环中,先把数组定义好,而不是像上面那样直接生成sql
0
; i
<
recc; i
++
) { deptNo[i]
=
i; dname[i]
=
i.ToString(); loc[i]
=
i.ToString(); }
这个调用将把参数数组传进sql,同时写入数据库
command.ExecuteNonQuery(); sw.Stop(); System.Diagnostics.Debug.WriteLine(
批量插入:
"
+
sw.ElapsedMilliseconds.ToString());