2010-02-01 68 views
0

我一次插入一个包含5000条记录的块,一个块正好在另一个块之后。这些命令是在独立的DLL中创建的,可以调用4种不同存储过程中的任何一种。有没有可以加快速度的批量插入方法。当然,每个记录大约需要1.5个MS,并且希望将其降低到大约.7 MS。帮助使用VB.NET将批量插入到Oracle中

谢谢,

戴夫

Shared Sub WriteCMSMessagesToDatabase(ByVal myFacility As FacilityType, ByVal Commands As List(Of System.Data.OracleClient.OracleCommand)) 

    Dim oracleConnection As New OracleConnection 
    Dim _Cmd As New OracleCommand 

    Try 
     Dim aStopWatch As New Stopwatch 
     Using oracleConnection 

      aStopWatch.Start() 
      oracleConnection.ConnectionString = myFacility.ConnectionString 
      _Cmd.Connection = oracleConnection 
      _Cmd.CommandType = CommandType.StoredProcedure 
      oracleConnection.Open() 

      _Cmd.Transaction = oracleConnection.BeginTransaction 

      For Each aCmd As OracleCommand In Commands 
       _Cmd.CommandText = aCmd.CommandText 
       _Cmd.Parameters.Clear() 

       For Each aParam As OracleParameter In aCmd.Parameters 
        Dim prm As New OracleParameter 
        prm = CType(DirectCast(aParam, ICloneable).Clone, OracleParameter) 
        _Cmd.Parameters.Add(prm) 
       Next 

       _Cmd.ExecuteNonQuery() 
      Next 

      _Cmd.Transaction.Commit() 
      aStopWatch.Stop() 

     End Using 

    Catch ex As Exception 



    End Try 


End Sub 

回答

0

如果正在使用Oracle ODP.NET客户端,可以通过在值的阵列结合到每个参数插入在单个数据库往返多个记录您的查询如图所示herehere。我不确定System.Data.OracleClient类是否支持这种功能,但如果不支持,您可能无法更改提供程序,因此这可能不是一种选择。

0

正如李说的那样,使用数组批量绑定。如果你不能做到这一点,你可以通过创建一个存储过程,需要你的论点

即如果你有1000行3列中插入大,连在一起假的,你可以创建一个存储过程:

PROCEDURE bulk_ins(
    col1 VARCHAR2, 
    cal2 VARCHAR2, 
    col3 VARCHAR2 
) 
IS BEGIN 
    FOR i in 0..20 LOOP 
    INSERT INTO t (SUBSTR(col1, (20*i)+1, 20), SUBSTR(col2, (10*i)+1, 10), SUBSTR(col3, (30*i)+1, 30)); 
    END LOOP; 
END; 

然后在.NET中,使它们的倍数建立你的参数:

StringBuilder s1, s2, s3; 
for(int i = 0; i<50; i++){ 
    s1.AppendFormat("{0:20}", col1value[i]); 
    s2.AppendFormat("{0:10}", col2value[i]); 
    s3.AppendFormat("{0:30}", col3value[i]); 
} 

,然后调用进程内。 请注意,您可能不得不删除空格的值,但这与批量绑定差不多。缓慢的部分是将数据导入到oracle数据库中。将其批量转移