【问题标题】:Help Optomizing Bulk Inserts into Oracle Using VB.NET帮助使用 VB.NET 优化向 Oracle 中的批量插入
【发布时间】:2010-02-01 21:05:49
【问题描述】:

我一次插入一个包含 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

【问题讨论】:

    标签: vb.net oracle10g system.data system.data.oracleclient


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      正如 lee 所说,使用数组批量绑定。如果你不能做到这一点,你可以通过创建一个存储过程来伪造它,该过程需要你的参数的大的连接版本

      即如果你有 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 数据库中。批量转入

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 2013-11-19
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 2012-11-10
        • 2014-01-16
        • 1970-01-01
        相关资源
        最近更新 更多