IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Optimisation de code


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut Optimisation de code
    Bonjour à tous,

    J'ai un bout de code qui devient de plus en plus long en temps de traitement (avec l'augmentation des données présentes)
    J'aurais voulu savoir si l'un d'entre vous avait une idée pour l'optimiser ?
    J'ai regardé si il existait pas un bout de code pour faire tous les INSERT en même temps mais j'ai pas trouvé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     'Insérer les valeurs prolongées à l'aide des calculs à partir des bases précédentes et des indices de remplacements.
        Public Sub insererValeurProlongeePasse()
            Dim remplacement As Boolean = True
            Dim base As Boolean = True
            While (remplacement Or base)
                'Traitement des valeurs pour les anciennes base100
                'Requete permettant de détecter les indices dont il existe des valeurs pour les bases précédentes mais pas pour cet indice.
                Dim requete As String = "SELECT DISTINCT t1.v_abrege,t1.v_base100,t1.minMois FROM (SELECT  v_abrege,v_base100,MIN(v_valeurMois) as minMois FROM T_Valeurs GROUP BY v_abrege,v_base100) as t1, T_Valeurs as t2 WHERE t1.v_abrege=t2.v_abrege AND t1.v_base100 > t2.v_base100 AND t1.minMois>t2.v_valeurMois ORDER BY t1.v_abrege,t1.v_base100"
                Dim resultat = BDOutil.executeRequeteSelect(requete)
                If (resultat.Rows.Count = 0) Then
                    base = False
                Else
                    base = True
                End If
                For Each row In resultat.Rows
                    Dim abrege As String = row(0).ToString()
                    Dim base100 As String = row(1).ToString()
                    Dim moisMin As String = row(2).ToString()
                    'Après avoir récupérer les indices et leurs bases100, on crée une requete permettant de récupérer les valeurs pour la base100 précédentes qui manquent dans la nouvelle base100. On pense à récupérer le coefficient de changement dans la table de Base100 qui indique les liens des changements (de quel base100 à quel base100).
                    Dim requete2 As String = "SELECT t1.V_Abrege,t1.V_Base100,t1.V_valeur,t1.V_ValeurMois,t2.B_Coefficient_Changement_Base FROM T_Valeurs As t1,T_base100 as t2 WHERE t2.B_Abrege='" + abrege + "' AND t2.B_Nouvelle_Base100=" + base100 + " AND t2.B_Base100=t1.V_Base100 AND t2.B_Abrege=t1.V_Abrege AND t1.V_ValeurMois<" + moisMin + ""
                    Dim resultat2 = BDOutil.executeRequeteSelect(requete2)
                    For Each row2 In resultat2.Rows
                        Dim dateDepart As Date = New Date(1900, 1, 1)
                        Dim valeurATraite As Double = CType(row2(2).ToString, Double)
                        Dim valeurMois As Integer = CType(row2(3).ToString, Integer)
                        Dim dateTemp = dateDepart.AddMonths(valeurMois)
                        Dim mois As String = dateTemp.Month.ToString + "/" + dateTemp.Year.ToString
                        Dim coefficient As Double = Math.Round(CType(row2(4).ToString, Double), 4)
                        Dim valeurTraite As Double = valeurATraite / coefficient
                        'On traite chacune des valeurs qu'on insère dans la base de données pour la base100 ou il manquait les valeurs (on pense bien à diviser la valeur de l'ancienne base par le coefficient avant de l'attribuer à la nouvelle base.)
                        Dim requeteInsertion As String = "INSERT INTO T_Valeurs VALUES('" + abrege + "'," + base100 + ",#" + mois + "#,'" + valeurTraite.ToString + "'," + valeurMois.ToString + ",'ProlongeeP')"
                        BDOutil.executeRequeteMAJ(requeteInsertion)
                        Threading.Thread.Sleep(15)
                    Next
                Next row
                'Traitement des valeurs pour les indices de remplacements.
                'La logique du traitement est la même à la seule différence qu'on ne cherche pas les anciennes bases mais les remplacés.
                'On récupère les indices qui en ont remplacer d'autres et dont il n'existe pas de valeurs pour les dates avant le remplacement alors qu'elles existent pour les remplacés
                requete = "SELECT DISTINCT t1.v_abrege,t1.v_base100,t1.minMois FROM (SELECT  v_abrege,v_base100,IR_Abrege_Indice_Supprime,MIN(v_valeurMois) as minMois FROM T_Valeurs,T_Indice_Remplacement WHERE IR_Abrege_Indice_Remplacement=v_abrege AND IR_Base100_Indice_Remplacement=v_base100 GROUP BY v_abrege,v_base100,IR_Abrege_Indice_Supprime,IR_Date_Raccordement ORDER BY IR_Date_Raccordement) as t1, T_Valeurs as t2,T_Base100 as t3 WHERE IR_Abrege_Indice_Supprime=t2.v_abrege AND t2.v_base100=t3.b_base100 AND t3.b_derniere_base100=TRUE AND t3.b_abrege= IR_Abrege_Indice_Supprime AND t1.minMois>t2.v_valeurMois ORDER BY t1.v_abrege,t1.v_base100"
                resultat = BDOutil.executeRequeteSelect(requete)
                If (resultat.Rows.Count = 0) Then
                    remplacement = False
                Else
                    remplacement = True
                End If
                For Each row In resultat.Rows
                    Dim abrege As String = row(0).ToString()
                    Dim base100 As String = row(1).ToString()
                    Dim moisMin As String = row(2).ToString()
                    Dim requete2 As String = "SELECT t1.V_Abrege,t1.V_Base100,t1.V_valeur,t1.V_ValeurMois,t2.IR_Coefficient_Raccordement FROM t_Valeurs as t1,t_Indice_Remplacement as t2,t_Base100 as t3 WHERE t2.IR_Abrege_Indice_Remplacement='" + abrege + "' AND t2.IR_Base100_Indice_Remplacement=" + base100 + " AND t2.IR_Abrege_Indice_Supprime=t1.v_Abrege AND t2.IR_Reconstitue=TRUE AND t3.b_abrege=t1.v_Abrege AND t3.b_base100=t1.v_base100 AND t3.b_derniere_base100=TRUE AND t1.v_ValeurMois<" + moisMin + ""
                    Dim resultat2 = BDOutil.executeRequeteSelect(requete2)
                    For Each row2 In resultat2.Rows
                        Dim dateDepart As Date = New Date(1900, 1, 1)
                        Dim valeurATraite As Double = CType(row2(2).ToString, Double)
                        Dim valeurMois As Integer = CType(row2(3).ToString, Integer)
                        Dim dateTemp = dateDepart.AddMonths(valeurMois)
                        Dim mois As String = dateTemp.Month.ToString + "/" + dateTemp.Year.ToString
                        Dim coefficient As Double = Math.Round(CType(row2(4).ToString, Double), 4)
                        Dim valeurTraite As Double = valeurATraite / coefficient
                        'On traite chacune des valeurs qu'on insère dans la base de données pour la base100 ou il manquait les valeurs (on pense bien à diviser la valeur de l'ancienne base par le coefficient avant de l'attribuer à la nouvelle base.)
                        Dim requeteInsertion As String = "INSERT INTO T_Valeurs VALUES('" + abrege + "'," + base100 + ",#" + mois + "#,'" + valeurTraite.ToString + "'," + valeurMois.ToString + ",'ProlongeeP')"
                        BDOutil.executeRequeteMAJ(requeteInsertion)
                        Threading.Thread.Sleep(15)
                    Next
                Next
            End While
        End Sub
    Pour le code de la base données
    De plus sur un PC plus puissant il me dit que j'ouvre trop de curseurs en même temps donc ça plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Public Sub executeRequeteMAJ(ByVal requete As String)
            Dim commandOdbc As OdbcCommand
            Try
                'connexion.Open()
                'Dim command As OleDbCommand = New OleDbCommand(requete, connexion)
                'command.ExecuteNonQuery()
                'connexion.Close()
                'connexionOdbc.Open()
                commandOdbc = New OdbcCommand(requete, connexionOdbc)
                commandOdbc.ExecuteNonQuery()
            Catch e As Exception
                OutilModule.afficherErreur("Erreur: " + e.Message)
                Throw e
            Finally
                commandOdbc = Nothing
                'connexionOdbc.Close()
            End Try
        End Sub
    Merci par avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Par défaut Utiliser des index et les bons.
    Salut,

    Afin que tes requêtes de sélection soient performantes, certains champs doivent être indexés; surtout ceux utilisés dans le Group By et/ou Where.

    Sans une description détaillée des tables et des champs impliqués et de leur lien, il est quasi impossible de "changer" les SELECTs.

    En résumé, vérifier les index et une explication du fonctionnement.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    j'ai pas lu le code mais ca ressemble à ce qu'il ne faut pas faire ^^


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into table (colonnes) select colonnes from autreTable

    déjà les bases de données sont énormément plus rapide quand on traite par lot
    et ramener des données de la base vers un programme pour les remettre dans la base ca fait perdre du temps pour rien
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Pourquoi y'a t'il ces instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Threading.Thread.Sleep(15)

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Pourquoi y'a t'il ces instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Threading.Thread.Sleep(15)
    Ca doit être une application de ça
    http://thedailywtf.com/Articles/The-Speedup-Loop.aspx

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut
    Les requêtes de select ne sont pas longues et je ne pense pas qu'elles posent problème.
    Je pense que le plus long c'est les multiples insert de la ligne 62. Il n'y a pas moyen de stocker toutes les insert dans un champ texte et de toute les exécuter en une seule fois ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo