a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 184|回复: 1

[考试辅导] Oracle技术:数据的批量插入

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
前两天接到一个需求——需要编程将SQL Server中的数据插入至Oracle。数据大约有20多万条记录。开始的时候我采取了直接构建SQL插入的方式,结果耗时太长。为了提高性能我上网找了资料。最终采用DataAdapter批量插入至Oracle,提高了性能。考试大-全国最大教育类网站(www.Examda。com)8 |! i9 t  k5 E. I3 ?& ~0 D) ~
  代码如下:
9 q: j% b8 C9 T" x. G  一,直接构建SQL语句插入
8 }8 D; n9 Q6 J/ N9 R) V  VB.NET
1 x9 ^6 q+ f& |4 l7 F2 Q  1 sw.Start()
1 x  q3 W1 X3 V6 g  2 ''''Read Z02J from SQL Server
) ?8 R, r6 N# I  r  3 Dim sqlCmd As New SqlCommand()0 B6 ^- ~2 i- S+ O/ ?
  4 sqlCmd.Connection = sqlConnection
6 }' z" l9 K' L4 G! U( P6 y: d3 e+ v  5 sqlCmd.CommandText = "SELECT * FROM Z02J"
9 f6 p/ N7 b. r- O' v  6* |% M/ e7 B" R
  7 Dim sqlDr As SqlDataReader, `) D; E- Q: T& m/ M: I. e
  8 sqlDr = sqlCmd.ExecuteReader()
, \3 [5 `( f  E0 |/ Y  9. D8 O: T8 l& }8 f
  10 Dim cmdInsertZ02J As New OracleCommand()
8 g! f) ~9 q$ ?! Y% D$ D* E  11 cmdInsertZ02J.Connection = oraConnection$ Y& o/ O& a8 o! ~  Y% Q
  12 cmdInsertZ02J.CommandText = BuildSQLStatement(SQLType.Insert,"z02j")& X( }( g# Z( p! ~6 E) v* p3 \
  13+ _# E! V/ _# t0 ~" k" |% }
  14 Dim plantLever, material, oldMaterialNum, materialDescription As Object
* L' d1 l9 y4 G' Z. @  15 While sqlDr.Read()
6 y; U5 P5 m, B5 T0 \+ t* j  16 plantLever = ReadSqlDataReader(sqlDr, 0, "")  m' h3 j. ]' t+ q5 T! g8 w- X
  17 material = ReadSqlDataReader(sqlDr, 1, "")
% A4 [) `- _6 Y  \  P8 L  18 oldMaterialNum = ReadSqlDataReader(sqlDr, 2, "")  a' h  s3 V$ r( U6 u
  19 materialDescription = ReadSqlDataReader(sqlDr, 3, "")
- w0 g4 J" m# S; W) [: g  20 ''Insert to Oracle table Z02J
1 D2 {7 ?7 v8 C8 z, d6 P$ s  21 cmdInsertZ02J.Parameters.AddWithValue(":plantLever", plantLever)
8 p+ S$ f# t% ~* R  22 cmdInsertZ02J.Parameters.AddWithValue(":material", material)
( g6 [. V5 o' ~# L- I  23 cmdInsertZ02J.Parameters.AddWithValue(":oldMaterialNum", oldMaterialNum)
) O" V7 P: ~- k& J4 c  24 cmdInsertZ02J.Parameters.AddWithValue(":materialDescription", materialDescription)
; x* ~# M( s: }% s" r5 y1 n: S  25 cmdInsertZ02J.ExecuteNonQuery()
, q/ x1 D6 a- d  26 End While: P3 F: Y1 s7 U4 B& }- j
  27 sw.Stop(): k$ a3 {! U* V
  28 Loger.Info("Reading z02j form sql sever used", sw.Elapsed.TotalSeconds.ToString())
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:数据的批量插入

  二,采用DataAdapter实现批量插入" u( ?: |- _# x5 H
  VB.NET
$ g, \. r# P5 U6 M  1 sw.Start()
: ~9 Q4 C- j3 B' N0 W8 D( V  2 ''''Read Z02J from SQL Server
- j  P- T+ U; m2 t. I  3 Dim sqlCmd As New SqlCommand()1 Y- O4 m- o+ |* b1 }$ ^) b
  4 sqlCmd.Connection = sqlConnection( z4 v6 R! V+ M. W( N7 D
  5 sqlCmd.CommandText = "SELECT * FROM Z02J"2 B% O. [' _% w4 k6 ~& V4 y
  6
0 E3 Q$ I5 ]+ P  7 Dim sqlDr As SqlDataReader
' y* D5 s) Y/ T9 t  u( E  8 sqlDr = sqlCmd.ExecuteReader()' O5 i- C7 r% z; z. _) [. G& }
  9
0 p5 ~) A) M6 `) o- K! m  10 Dim cmdInsertZ02J As New OracleCommand()
) y9 h; l6 P  t& I; k) _$ b# s  P  11 cmdInsertZ02J.Connection = oraConnection5 M; L) {' B1 b+ L5 V
  12 cmdInsertZ02J.CommandText = BuildSQLStatement(SQLType.Insert,"z02j")9 g3 k) S7 F& F, l
  13
/ K3 z% {4 `* Y- i6 d  14 Dim dtSqlZ02J As New DataTable
% r9 @$ @& y: a( G$ l5 J* D: _4 d+ {  15 dtSqlZ02J.Columns.Add("plantLever")9 \& p$ |  ^; s4 m/ I- K
  16 dtSqlZ02J.Columns.Add("material")! ]/ I) v1 q' |' c. s" V  h3 y7 }
  17 dtSqlZ02J.Columns.Add("oldMaterialNum")4 x0 C  |: J/ h2 o% G
  18 dtSqlZ02J.Columns.Add("materialDescription")
% Y! ?; i8 W5 r6 j* ]; x6 A- b  19( l, U# w' e6 s2 C' u
  20 Dim plantLever, material, oldMaterialNum, materialDescription As Object$ q% d. D3 u- K! c) x4 W
  21 While sqlDr.Read()+ E2 L. P% {, a3 ~: ?' n
  22 plantLever = ReadSqlDataReader(sqlDr, 0, "")
: Z. c2 T# F* ^3 I3 e6 r+ W  23 material = ReadSqlDataReader(sqlDr, 1, "")
- Y' f% w4 Y) g1 q2 P' s$ n  24 oldMaterialNum = ReadSqlDataReader(sqlDr, 2, "")4 o6 f& i: j2 m9 e; r7 p& N4 ?
  25 materialDescription = ReadSqlDataReader(sqlDr, 3, "")/ z% _$ e2 x$ ~) l4 t
  26 dtSqlZ02J.Rows.Add(plantLever, material, oldMaterialNum, materialDescription)
& h, b7 @6 a# Y; a. N  27 End While
& z5 V# W7 u+ U$ i: [- K9 b  28 sw.Stop()
& N) b" s. u2 @& z' U/ Q" R  29 Loger.Info("Reading z02j form sql sever used", sw.Elapsed.TotalSeconds.ToString())
3 t- C# J; S9 k7 i2 E  ^. i  u  30
# ]- }5 Z/ H/ s8 k2 r  31 sw.Start()( N1 F  z, k1 S; d! e3 U$ O2 ^
  32 Dim oraDa As New OracleDataAdapter()9 H* s8 C9 n5 `& k& Y( I0 Z+ A
  33 oraDa.InsertCommand = cmdInsertZ02J* v3 c. a0 T3 y$ X# d
  34 oraDa.InsertCommand.Parameters.Add(":plantLever", OracleType.Char, 255, "plantLever")$ J8 y8 j! `! l# t3 J9 a+ t6 o
  35 oraDa.InsertCommand.Parameters.Add(":material", OracleType.Char, 255, "material")
0 T" E" r: H) u9 E  36 oraDa.InsertCommand.Parameters.Add(":oldMaterialNum", OracleType.Char, 255, "oldMaterialNum")* f; \; D1 m- V4 D6 ]1 E
  37 oraDa.InsertCommand.Parameters.Add(":materialDescription", OracleType.Char, 500, "materialDescription")3 B- L, T, J4 o
  38* s& D  N" G5 z
  39 oraDa.InsertCommand.UpdatedRowSource = UpdateRowSource.None+ _% B( }( ?) X
  40 oraDa.UpdateBatchSize = 20 '''Adjust the batch size based on testing result4 e- c6 @6 x! k0 s
  41% p# a9 Z& O: C6 v3 Z
  42 oraDa.Update(dtSqlZ02J)
( m" v& C2 `. N& B$ R* V! g  43 sw.Stop()" {# c* |0 W+ g, G+ s0 e. O7 h) B; ~
  44 Loger.Info("Insert to oracle used", sw.Elapsed.TotalSeconds.ToString())  r/ s, X" b' |2 \! W. w
  在我的环境中批量插入24万笔记录用时大约260s左右。
$ \! T6 V" w( }" I9 b  貌似SQL Server中。net驱动程序提供了SqlBulkCopy类来提高大量数据导入的性能。有需要的朋友可以查下MSDN.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-18 14:46 , Processed in 0.458380 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表