2010-02-01 13 views
0

Je suis un bloc de vous insérez les 5000 dossiers à la fois, un droit de bloc après l'autre. Les commandes sont créées dans une DLL séparée et peuvent appeler n'importe qui de 4 procédures stockées différentes. Y a-t-il une méthode d'insertion en masse qui pourrait accélérer ce processus? Actuellement, il faut environ 1,5 MS par enregistrement et voudrait faire descendre à environ .7 MS.Aide Optomizing Inserts en vrac dans Oracle à l'aide VB.NET

Merci,

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 

Répondre

0

Si vous utilisez le client Oracle ODP.NET, vous pouvez insérer plusieurs enregistrements dans une seule base de données aller-retour en liant un tableau de valeurs à chaque paramètre votre requête comme indiqué here et here. Je ne sais pas si les classes System.Data.OracleClient en charge cette fonctionnalité mais si cela peut ne pas être une option si elle ne fonctionne pas et vous ne pouvez pas changer de fournisseur.

0

Comme le dit Lee, tableau d'utilisation se fixe en vrac. Si vous ne pouvez pas faire cela, vous pouvez faux en créant une procédure stockée qui prend de grandes versions concaténés de vos arguments

à savoir si vous avez 1000 lignes de 3 colonnes à insérer, vous pouvez créer une procédure stockée:

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; 

Et puis en .net construire vos paramètres en les multiples:

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]); 
} 

Et puis appeler le proc. Notez que vous pouvez avoir à supprimer des espaces de valeurs, mais thisway est presque aussi rapide que la liaison en vrac .. La partie lente est l'obtention de données dans un oracle db. Transfert dans en vrac