2010-02-01 47 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數據庫中。將其批量轉移