0

一度に5000レコードのブロックを、次々に挿入しています。コマンドは個別のDLLで作成され、4つの異なるストアドプロシージャのいずれかを呼び出すことができます。これをスピードアップする可能性のある一括挿入方法はありますか?現在、レコードあたり約1.5 MSかかり、これを約.7MSに下げたいと考えています。

ありがとう、

デイブ

 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

Oracle ODP.NET クライアントを使用している場合は、ここここに示すように、値の配列をクエリの各パラメーターにバインドすることで、1 回のデータベース ラウンド トリップで複数のレコードを挿入できます。System.Data.OracleClient クラスがこの機能をサポートしているかどうかはわかりませんが、サポートされておらず、プロバイダーを変更できない場合、これはオプションではない可能性があります。

于 2010-02-01T22:20:02.253 に答える
0

リーが言うように、配列の一括バインドを使用します。これができない場合は、連結された大きなバージョンの引数を取るストアド プロシージャを作成することで偽装できます。

つまり、挿入する 3 列の行が 1000 行ある場合は、ストアド プロシージャを作成できます。

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 データベースにデータを取得することです。一括で転送する

于 2010-04-28T01:13:55.093 に答える