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

Langage Delphi Discussion :

Optimisation création requête multiple


Sujet :

Langage Delphi

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut Optimisation création requête multiple
    Bonjour j'ai créer une procédure pour charger un fichier text, le fichier texte contient environ 36 000 lignes et je mets 7 secondes pour traiter 1600 lignes
    je trouve ça horriblement lent

    Je dois sûrement mal m'y prendre

    C'est ma boucle qui permet d'insérer les lignes une à une dans mon TADOQuery qui est longue je n'ai même pas essayé d'insérer les données

    Je suis sûr que les professionnels que vous êtes avez des conseils à me donner, merci d'avance.

    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
    Procedure TMain.btLoadCodePostalClick(Sender: TObject);
    Var
      NewCode: TStringList;
      I:       Integer;
    Begin
      If Not OpenTextFileDialog.Execute Then
        Exit; //si aucun fichier n'est spécifié je quitte la procédure
      Try
        btLoadCodePostal.Enabled := False; //je désactive mon bouton
        NewCode                  := TStringList.Create; //je crée une liste
        NewCode.LoadFromFile(OpenTextFileDialog.FileName); //je charge mon fichier dans la liste
        If NewCode.Count > 30000 Then //si la liste contient plus de 30 000 lignes il est sûrement correct
        Begin
          ADOQuery.SQL.Clear;
          ADOQuery.SQL.Add('DELETE FROM `codes postal`;' + sLineBreak); //je vide la table des anciens codes
          I := NewCode.Count - 1;
          While I > 0 Do //je boucle pour créer les requêtes afin de insérer les nouveaux codes
          Begin
            //je récupère dans chaque ligne les cinq premiers caractères, et la fin de la ligne moins les six premiers caractères
            ADOQuery.SQL.Add('INSERT INTO `codes postal` VALUES (''' + Copy(NewCode[I], 1, 5) + ''', ''' +
              Copy(NewCode[I], 7, Length(NewCode[I])) + ''');' + sLineBreak);
            Dec(I);
          End;
          ADOQuery.ExecSQL; //j'exécute mes requêtes
        End
        Else
          ShowMessage('Moins de 30000 lignes le fichiers est sûrement incorrect!');
      Finally
        NewCode.Free; //je libère ma liste
        btLoadCodePostal.Enabled := True; //je réactive mon bouton
      End;
    End;
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  2. #2
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    j'ai fait l'ajout de requete par bloque de 1000, sa met 3sec maintenant

    par contre dans mon string temporaire comment virer à la fin la dernière virgule espace?
    Exemple: ('test, 'vbv'), ('test, 'vbv'), ('test, 'vbv'), ('test, 'vbv'),

    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
    Procedure TMain.btLoadCodePostalClick(Sender: TObject);
    Var
      NewCode:   TStringList;
      I, Nb:     Integer;
      TmpInsert: String;
    Begin
      If Not OpenTextFileDialog.Execute Then
        Exit; //si aucun fichier n'est spécifié je quitte la procédure
      Try
        btLoadCodePostal.Enabled := False; //je désactive mon bouton
        NewCode                  := TStringList.Create; //je crée une liste
        NewCode.LoadFromFile(OpenTextFileDialog.FileName); //je charge mon fichier dans la liste
        If NewCode.Count > 30000 Then //si la liste contient plus de 30 000 lignes il est sûrement correct
        Begin
          ADOQuery.SQL.Clear;
          ADOQuery.SQL.Add('DELETE FROM `codes postal`;' + sLineBreak); //je vide la table des anciens codes
          I         := NewCode.Count - 1;
          Nb        := 0;
          TmpInsert := '';
          While I > -1 Do //je boucle pour créer les requêtes afin de insérer les nouveaux codes
          Begin
            If NewCode[I] = '' Then //si la ligne est vide je la saute
              Continue;
            //je récupère dans chaque ligne les cinq premiers caractères, et la fin de la ligne moins les six premiers caractères
            TmpInsert := TmpInsert + '(''' + Copy(NewCode[I], 1, 5) + ''', ''' + Copy(NewCode[I], 7, Length(NewCode[I])) + '''), ';
            If Nb > 999 Then //si mon string temporaire contient 1000 code j'insère la requete
            Begin
              //del dernier ), dans tmpinsert
              ADOQuery.SQL.Add('INSERT INTO `codes postal` VALUES ' + TmpInsert + ';' + sLineBreak);
              Nb        := 0;
              TmpInsert := '';
            End Else
              Inc(Nb);
            Dec(I);
          End;
          //del dernier ), dans tmpinsert
          ADOQuery.SQL.Add('INSERT INTO `codes postal` VALUES ' + TmpInsert + ';' + sLineBreak);
          //      ADOQuery.ExecSQL; //j'exécute mes requêtes
        End
        Else
          ShowMessage('Moins de 30000 lignes le fichiers est sûrement incorrect!');
      Finally
        NewCode.Free; //je libère ma liste
        btLoadCodePostal.Enabled := True; //je réactive mon bouton
      End;
    End;
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Moi pour couper à droite j'utilise cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function StrCoupeADroite(const S : string; const Count : integer) : string;
    begin
        result := S;
        if (count = 0) or (count > Length(S)) then exit;
        SetLength(result,Length(S)-Count);
    end;
    Pour ton exemple tu pourrais faire cela ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmpinsert := StrCoupeDroite(tmpinsert,1);
    Bye

  4. #4
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    Je garde ton astuce avec setlength car j'utilise copy et ta méthode est sûrement plus rapide.

    Je vous met la fonction fonctionnelle:
    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
     
    Procedure TMain.btLoadCodePostalClick(Sender: TObject);
    Var
      NewCode: TStringList;
      I, Nb:   Integer;
    Begin
      If Not OpenTextFileDialog.Execute Then
        Exit; //si aucun fichier n'est spécifié je quitte la procédure
      Try
        btLoadCodePostal.Enabled := False; //je désactive mon bouton
        NewCode                  := TStringList.Create; //je crée une liste
        NewCode.LoadFromFile(OpenTextFileDialog.FileName); //je charge mon fichier dans la liste
        If NewCode.Count > 30000 Then //si la liste contient plus de 30 000 lignes il est sûrement correct
        Begin
          ADOQuery.SQL.Clear;
          ADOQuery.SQL.Add('DELETE FROM `code_postal`;' + sLineBreak); //je vide la table des anciens codes
          ADOQuery.Prepared := True;
          ADOQuery.ExecSQL; //j'exécute ma requêtes
          I  := NewCode.Count - 1;
          Nb := 0;
          While I > -1 Do //je boucle pour créer les requêtes afin de insérer les nouveaux codes
          Begin
            If NewCode[i] = '' Then //si la ligne est vide je la saute
              Continue;
            //je récupère dans chaque ligne les cinq premiers caractères, et la fin de la ligne moins les six premiers caractères
            ADOQuery.SQL.Clear;
            ADOQuery.SQL.Add('INSERT INTO `code_postal` (code, ville) VALUES (' + Copy(NewCode[i], 1, 5) + ', ''' + Copy(NewCode[i], 7, Length(NewCode[i])) + ''');' + sLineBreak);
            ADOQuery.Prepared := True;
            ADOQuery.ExecSQL; //j'exécute ma requêtes
            Dec(I);
          End;
        End
        Else
          ShowMessage('Moins de 30000 lignes le fichiers est sûrement incorrect!');
      Finally
        NewCode.Free; //je libère ma liste
        btLoadCodePostal.Enabled := True; //je réactive mon bouton
      End;
    End;
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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