2010-02-01 3 views
0

한 번에 한 블록 씩 5000 개의 레코드 블록을 삽입하고 있습니다. 명령은 별도의 DLL로 만들어지며 4 개의 다른 저장 프로 시저 중 하나를 호출 할 수 있습니다. 이 속도를 높이는 대량 삽입 방법이 있습니까? 현명하게도 그것은 레코드 당 약 1.5 MS를 필요로하며 이것을 약 .7 MS로 낮추고 싶습니다.Help VB.NET을 사용하여 Oracle에 벌크 삽입물 최적화하기

감사합니다,

데이브

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

당신이, 당신은 각각의 매개 변수 값의 배열을 결합하여 단일 데이터베이스 라운드 트립에서 여러 레코드를 삽입 할 수있는 오라클 ODP.NET 클라이언트를 사용하는 경우 쿼리는 herehere입니다. System.Data.OracleClient 클래스가이 기능을 지원하는지 잘 모르겠습니다. 그렇지만이 옵션이 없으면 공급자가 변경되지 않을 수 있습니다.

0

이 말처럼 어레이 일괄 바인드를 사용하십시오.

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; 
: 당신의 인수

즉, 삽입하는 3 열 1000 개 행이있을 경우 많은, 연결된 버전 걸리는 저장 프로 시저를 작성하여 그것을 가짜, 당신은 저장 프로 시저를 만들 수 있습니다 당신은이 작업을 수행 할 수없는 경우 수

그리고 그들에게 배수를 제작하여 매개 변수를 구축 .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]); 
} 

을 그리고 다음 시저를 호출합니다. 값에서 공백을 삭제해야하지만이 방법은 대량 바인딩과 거의 비슷합니다. 느린 부분은 오라클 db로 데이터를 가져 오는 것입니다. 대량으로 이체하십시오.