0

我一次插入一个包含 5000 条记录的块,一个块紧接着另一个块。这些命令在单独的 DLL 中创建,可以调用 4 个不同存储过程中的任何一个。是否有可能加快此速度的批量插入方法。目前,每条记录大约需要 1.5 MS,并且希望将其降低到大约 0.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
4

2 回答 2

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 数据库。批量转入

于 2010-04-28T01:13:55.093 回答
0

如果您使用的是 Oracle ODP.NET 客户端,则可以通过将一组值绑定到查询中的每个参数来在单个数据库往返中插入多条记录,如此此处所示。我不确定 System.Data.OracleClient 类是否支持此功能,因此如果不支持并且您无法更改提供程序,这可能不是一个选项。

于 2010-02-01T22:20:02.253 回答