我一次插入一个包含5000条记录的块,一块接着一块。这些命令是在单独的DLL中创建的,可以调用4个不同存储过程中的任何一个。是否有批量插入方法可以加快这一点。相比之下,每条记录需要大约1.5 MS,并且希望将其降低到大约.7 MS。
谢谢,
戴夫
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 :(得分:0)
如果您使用的是Oracle ODP.NET客户端,则可以通过将一组值绑定到查询中的每个参数来在单个数据库往返中插入多个记录,如here和here所示。我不确定System.Data.OracleClient类是否支持此功能,因此如果不支持,则可能不是一个选项,并且您无法更改提供程序。
答案 1 :(得分: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]);
}
然后调用proc。 请注意,您可能必须删除值的空格,但这几乎与批量绑定一样快。慢速部分是将数据导入oracle db。批量转移