經過長時間接觸Oracle Insert和bulk Insert,我對比了一下他們的執行效率。在這裡和大家分享一下,希望你看完本文後有不少收獲。
測試Java的insert 同使用9i以後的bulk Insert 的速度,結果顯示通過bulk Insert 速度相當的快.
100000條記錄
insert ,---------------93秒
bulk Insert -------------0.441秒
環境:
Oracle 10.2.0.3 Windows 2000Server
Java
代碼:
- SQL> desc a
- Name Type Nullable Default Comments
- ---- ------------ -------- ------- --------
- ID INTEGER Y
- NAME VARCHAR2(20) Y
bulk Insert 使用的類型及過程
- create or replace type i_table is table of number(10);
- create or replace type v_table is table of varchar2(10);
- create or replace procedure pro_forall_insert(v_1 i_table,v_2 v_table)
- as
- c integer;
- begin
- forall i in 1.. v_1.count
- insert into a values(v_1(i),v_2(i));
- end;
測試的Java代碼:
- import Java.io.*;
- import Java.sql.*;
- import Java.util.*;
- import Javax.naming.Context;
- import Javax.naming.InitialContext;
- import Javax.naming.*;
- import oracle.jdbc.OracleTypes;
- import Oracle.sql.*;
- import Oracle.sql.ARRAY;
- import Oracle.sql.ArrayDescriptor;
- import Oracle.sql.STRUCT;
- import Oracle.sql.StructDescriptor;
- import Java.sql.Connection;
- import Java.sql.DriverManager;
- import oracle.jdbc.OracleCallableStatement;
- public class testOracle {
- public testOracle() {
- Connection oraCon = null;
- PreparedStatement ps = null;
- Statement st = null;
- ResultSet rs = null;
- try {
- try {
- Class.forName("oracle.jdbc.driver.OracleDriver");
- } catch (ClassNotFoundException ex) {}
- oraCon = DriverManager.getConnection("jdbc:Oracle:thin:@192.168.15.234:1521:ora10g", "imcs","imcs");
- oraCon.setAutoCommit(false);
- } catch (SQLException ex) {
- ex.printStackTrace();
- }
- CallableStatement cstmt = null;
- Oracle.sql.ArrayDescriptor a = null;
- Oracle.sql.ArrayDescriptor b = null;
- if (1 == 1 )
- {
- Object[] s1 = new Object[100000];
- Object[] s2 = new Object[100000];
- for (int i = 0; i < 100000; i++) {
- s1[i] = new Integer(1);
- s2[i] = new String("aaa").concat(String.valueOf(i));
- }
- try {
- a = Oracle.sql.ArrayDescriptor.createDescriptor("I_TABLE", oraCon);
- b = Oracle.sql.ArrayDescriptor.createDescriptor("V_TABLE", oraCon);
- ARRAY a_test = new ARRAY(a, oraCon, s1);
- ARRAY b_test = new ARRAY(b, oraCon, s2);
- cstmt = oraCon.prepareCall("{ call pro_forall_insert(?,?) }");
- cstmt.setObject(1, a_test);
- cstmt.setObject(2, b_test);
- long aaaa = System.currentTimeMillis();
- System.out.println(System.currentTimeMillis());
- cstmt.execute();
- oraCon.commit();
- System.out.println(System.currentTimeMillis()-aaaa);
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- else
- {
- try
- {
- PreparedStatement oraPs = null;
- String oraInsertSql =
- "insert into a values(?,?)";
- oraPs = oraCon.prepareStatement(oraInsertSql);
- long aaaa = System.currentTimeMillis();
- System.out.println(System.currentTimeMillis());
- for (int i = 0; i < 100000; i++)
- {
- oraPs.setInt(1,i);
- oraPs.setString(2, new String("aaa").concat(String.valueOf(i)));
- oraPs.executeUpdate();
- }
- oraCon.commit();
- System.out.println(System.currentTimeMillis()-aaaa);
- }
- catch (SQLException ex)
- {
- System.out.print("dddddd");
- System.out.print(ex.getMessage());
- }
- }
- try {
- jbInit();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- public static void main(String args[]) {
- testOracle a = new testOracle();
- }
- private void jbInit() throws Exception {
- }
- };