Помощь Optomizing Массовые Вставки в Oracle Используя VB.NET - PullRequest
0 голосов
/ 02 февраля 2010

Я вставляю блок из 5000 записей за раз, один блок сразу за другим. Команды создаются в отдельной DLL и могут вызывать любого из 4 различных хранимых процедур. Есть ли метод массовой вставки, который может ускорить это. В настоящее время это занимает около 1,5 мс на запись, и хотелось бы снизить его до 0,7 мс.

Спасибо

Dave

 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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2010

Как говорит Ли, используйте массивную привязку массива. Если вы не можете этого сделать, вы можете подделать его, создав хранимую процедуру, которая принимает большие объединенные версии ваших аргументов

т.е. Если вам нужно вставить 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 db Передайте это оптом

0 голосов
/ 02 февраля 2010

Если вы используете клиент Oracle ODP.NET, вы можете вставить несколько записей в одну поездку базы данных, привязав массив значений к каждому параметру в вашем запросе, как показано здесь и здесь . Я не уверен, что классы System.Data.OracleClient поддерживают эту функцию, хотя, возможно, это не вариант, если нет, и вы не можете сменить провайдера.

...