none
problème de temps d'éxecution RRS feed

  • Question

  • bonjour tout le monde,

    j'ai développé une application web  fait le chargement des tables depuis access vers une base oracle avec des traitement avant d'inserer les données. en tout il y'a trois tables a charger une contient 107000 enregistrement,la deuxième 32000 et la troisième 2400.

    le chargement prends environ 45 minutes. est-ce que c'est normale ou pas !!?

    voici un bout du code qui fait le chargement de la première table.

                    #region Connexion à la base de données Access
    
                    OleDbConnection connectAcc = new OleDbConnection();
                    connectAcc.ConnectionString = ConfigurationManager.ConnectionStrings["oConnectionString"].ConnectionString;
                    connectAcc.Open();
    
                    #endregion
    
                    #region Connexion à la base de données OracleClient
                  
                    string ConnString = "Data Source=(DESCRIPTION="
    
                                    + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=siege-sig-002)(PORT=1521)))"
    
                                    + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=SIG)));"
    
                                    + "User Id=SIG_ANALYSE;Password=ANALYSEdsi2011;";
    
                    OracleConnection connectOrcl = new OracleConnection(ConnString);
                    connectOrcl.Open();
    
                    #endregion
    
                    #region Chargement de la table ENCRASS
    
    
                    string queryAccess =
         "select ID_REGARD,CENTRE,COMMUNE,ENC_ZONE,ACC_REG,RELEVE,DEBIT,TRAFIC,METEO,TYPE_TAMPN,ENC_AGENT,ENC_OBSRVT,EAU_CLAIRE,NAT_DEPOT,PROF_REG,ENC_REG,ACC_REG,CENTRE,ENC_DATE,ACC_VEHCLE from ENCRASS";
    
                    OleDbCommand cmd = new OleDbCommand(queryAccess);
                    cmd.Connection = connectAcc;
                    OleDbDataReader reader = cmd.ExecuteReader();
    
                    if (reader.HasRows) //déterminer si le DataReader a retourné des résultats avant d'y lire
                    {
                        while (reader.Read())
                        {
    
                            #region Variables
    
                            int Var_ID_REGARD, Var_ENC_REG;
                            string Var_PROF_REG,
                                    Var_COMMUNE,
                                    Var_CENTRE,
                                    Var_ENC_DATE,
                                    Var_ZONE,
                                    Var_ACC_REG,
                                    Var_RELEVE,
                                    Var_DEBIT,
                                    Var_TRAFIC,
                                    Var_METEO,
                                    Var_TYPE_TAMPN,
                                    Var_ENC_AGENT,
                                    Var_ENC_OBSRVT,
                                    Var_EAU_CLAIRE,
                                    Var_NAT_DEPOT,
                                    Var_ACC_VEHCLE;
    
    
                            Var_ENC_DATE = reader["ENC_DATE"].ToString();
    
                            DateTime Var_ENC_DATE_test = Convert.ToDateTime(Var_ENC_DATE);
    
                            Var_ENC_DATE = Var_ENC_DATE_test.ToShortDateString();
                            Var_ID_REGARD = Convert.ToInt32(reader["ID_REGARD"]);
                            Var_CENTRE = reader["CENTRE"].ToString();
                            Var_ZONE = reader["ENC_ZONE"].ToString();
                            Var_COMMUNE = reader["COMMUNE"].ToString();
                            Var_ACC_REG = reader["ACC_REG"].ToString();
                            Var_RELEVE = reader["RELEVE"].ToString();
                            Var_DEBIT = reader["DEBIT"].ToString();
                            Var_TRAFIC = reader["TRAFIC"].ToString();
                            Var_METEO = reader["METEO"].ToString();
                            Var_TYPE_TAMPN = reader["TYPE_TAMPN"].ToString();
                            Var_ENC_AGENT = reader["ENC_AGENT"].ToString();
                            Var_ENC_OBSRVT = reader["ENC_OBSRVT"].ToString();
                            Var_EAU_CLAIRE = reader["EAU_CLAIRE"].ToString();
                            Var_NAT_DEPOT = reader["NAT_DEPOT"].ToString();
                            Var_PROF_REG = reader["PROF_REG"].ToString();
    
                            if (reader.IsDBNull(reader.GetOrdinal("ENC_REG")))
                                Var_ENC_REG = -1;
                            else
                                Var_ENC_REG = Convert.ToInt32(reader["ENC_REG"]);
    
                            Var_ACC_VEHCLE = reader["ACC_VEHCLE"].ToString();
    
                            #endregion
    
                            #region Requête Avec StringBuilder
                            StringBuilder querystring3 = new StringBuilder();
    
                            querystring3 = querystring3.Append("declare x integer; begin select count(ID_REGARD) into x from ETAT_ACTUEL_REGARD_TST where ID_REGARD=").Append(Var_ID_REGARD).Append(";if x<> 0  then update ETAT_ACTUEL_REGARD_TST set   CENTRE='").Append(Var_CENTRE.Replace("'", "''")).Append("',COMMUNE='").Append(Var_COMMUNE.Replace("'", "''")).Append("',ENC_ZONE='").Append(Var_ZONE.Replace("'", "''")).Append("', ACC_REG='").Append(Var_ACC_REG.Replace("'", "''")).Append("',RELEVE='").Append(Var_RELEVE.Replace("'", "''")).Append("',DEBIT='").Append(Var_DEBIT.Replace("'", "''")).Append("',TRAFIC='").Append(Var_TRAFIC.Replace("'", "''")).Append("',METEO='").Append(Var_METEO.Replace("'", "''")).Append("',TYPE_TAMPN='").Append(Var_TYPE_TAMPN.Replace("'", "''")).Append("',ENC_AGENT='").Append(Var_ENC_AGENT.Replace("'", "''")).Append("',ENC_OBSRVT='").Append(Var_ENC_OBSRVT.Replace("'", "''")).Append("',EAU_CLAIRE='").Append("',NAT_DEPOT='").Append(Var_NAT_DEPOT.Replace("'", "''")).Append("',PROF_REG='").Append(Var_PROF_REG.Replace("'", "''")).Append("',ENC_REG=").Append(Var_ENC_REG).Append(",ENC_DATE='").Append(Var_ENC_DATE).Append("',ACC_VEHCLE='").Append(Var_ACC_VEHCLE.Replace("'", "''")).Append("' where ID_REGARD=").Append(Var_ID_REGARD).Append(" and (ENC_DATE <= TO_DATE ('").Append(Var_ENC_DATE).Append("')  or ENC_DATE is null);
                            #endregion
    
                            OracleCommand command = new OracleCommand(querystring3.ToString());
                            command.Connection = connectOrcl;
                            command.ExecuteNonQuery();
    
    
                        }// fin de la boucle while
    
                        reader.Close();
                    }
    
                    else
                    {
                        reader.Close();
                        connectOrcl.Close(); //Déconnexion de la base de données OracleClient
                        connectAcc.Close(); //Déconnexion de la base de données Access
                    }
    
                    reader.Close();
                    #endregion

    mercredi 1 août 2012 09:19

Réponses

  • Bonjour,

    le temps de réponse ne dépend pas uniquement de votre code mais de nombreux facteurs comme la rapidité des disques durs, de contraintes réseaux si vos bases et appli web ne sont pas sur le même serveur, de puissance CPU...

    Néanmoins vous ne devriez pas utiliser une requête créée via un StringBuilder. En dehors des problèmes de sécurité, l'utilisation de paramètres sur les objets de type DbCommand pourraient permettre une meilleure utilisation du cache et du plan d’exécution de la base.

    Voir Configuring Parameters and Parameter Data Types (ADO.NET) : "Parameterized commands can also improve query execution performance, because they help the database server accurately match the incoming command with a proper cached query plan"

    Par ailleurs pour des insert en masse, il est beaucoup plus efficace d'utiliser les capacités de Bulk Insert de la base. Vous pouvez par exemple regarder les possibilités offertes par Oracle.DataAccess.Client.OracleBulkCopy et le driver Odp.Net fourni par oracle pour .Net

    Cordialement


    mercredi 1 août 2012 10:43
    Modérateur