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

Requêtes MySQL Discussion :

[MySql] temps de traitement interminable


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [MySql] temps de traitement interminable
    Bonjour à tous,
    J'ai posté sur le forum perl dans un premier temps mais on m'a conseillé de m'addresser à vous. Alors je me lance:
    (ne prenez pas garde au script perl, il a été vérifié sur le forum perl et est correct. je le mets juste pour que vous voyez où sont les insert et update et combien d'attribut y a dans ma table).

    Voilà mon souci. Je traite un fichier d'environ 7000 lignes. Pour chaque ligne je compare une donnée de la ligne à qui constitue une donnée unique. Si cette donnée est présente dan sma base de donnée, j'update les champs de l'enregistrement correspondant, sinon, j'insère un nouvel enregistrement.
    Voilà mon code:

    Code:
    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
    69
    70
     
    #!c:\perl\bin\perl.exe 
    ####### Packages ####################### 
    use TX2::BD; 
    use TX2::Tools; 
    use DBI; 
    $start=&TX2::Tools::GetDate('français'); 
    print "Start: $start\n"; 
    ######################################## 
    ####### Variables ###################### 
    $TrRcvDoc=".\\TRRCVDOC.txt"; 
    $table='trrcvdoc'; 
    $nbinsertion=0; 
    $nbupdate=0; 
    ######################################## 
     
    open(TRRCVDOC,$TrRcvDoc) or die "Erreur ouverture $TrRcvDoc $! \n"; 
    @TRRCVDOC=<TRRCVDOC>; 
    close (TRRCVDOC); 
    @newtab=map{ [substr($_,0,6), 
                      substr($_,6,5), 
                      substr($_,22,6), 
                      substr($_,28,5), 
                      substr($_,33,6), 
                      substr($_,39,5), 
                      substr($_,44,14), 
                      substr($_,58,14), 
                      substr($_,72,20), 
                      substr($_,92,1), 
                      substr($_,93,1), 
                      substr($_,94,5), 
                      substr($_,120,35), 
                      substr($_,155,35), 
                      substr($_,190,20), 
                      substr($_,210,1), 
                      substr($_,211,6), 
                      substr($_,217,3), 
                     ] } @TRRCVDOC; 
     
    $dbh=&TX2::BD::Connexion(); 
     
    foreach(my $i=0;$i<=$#newtab;$i++) 
    { 
        $req=$dbh->prepare("SELECT DATE_CREATION_DOC from trrcvdoc WHERE NUM_MESSAGE=\'$newtab[$i][8]\'"); 
        $req->execute(); 
        my $res=$req->fetchrow_array(); 
        $req->finish(); 
        if ($res ne "") 
        { 
              &TX2::BD::UPDATE($dbh,$table,'NUM_MESSAGE',$newtab[$i][8],'CODE_STATUT_1',$newtab[$i][9]); 
              $nbupdate++; 
        } 
        else 
        { 
              $insert="INSERT INTO trrcvdoc VALUES ('',"; 
              for(my $j=0;$j<=16;$j++) 
              { 
                  $insert.="\'".$newtab[$i][$j]."\',"; 
              } 
              $insert.="\'".$newtab[$i][17]."\')"; 
              $dbh->do($insert); 
              $insert=""; 
              $nbinsertion++; 
        } 
     
    $k++; 
    } 
    &TX2::BD::Deconnexion($dbh); 
    $end=&TX2::Tools::GetDate('français'); 
    print "End: $end\nDONE: $nbinsertion insertion(s) -- $nbupdate update(s)\n";

    Et bien, ce processus se fait en plus de 6 minutes prends 100% de mon UC.
    Machine: DELL Latitude D600
    Processeur: intel xeon 1,6ghz
    RAM: 512 Mo
    Version Perl: 5.8.6
    php myadmin 2.6.1


    Y a t'il un problème dans mon code pour que ce soit aussi long ?(réponse du forum perl: non ça à pas l'air d'être ça) car il y a vraiment très peu d'enregistrement dans ma base, 10000 tout au plus pour l'instant !!

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut


    de plus, si les "cadors" de Perl apprécient les scripts, ceux de MySQL attendent la description des tables....

    Sans ce complément, on pourra difficilement t'aider.

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par *** A LIRE AVANT DE POSTER ***
    Quand vous postez une requête SQL qui ne fonctionne pas, isolez-la de tout code PHP, ASP ou autres (c'est fastidieux de décrypter 300 lignes de code juste pour une requête).
    http://www.developpez.net/forums/viewtopic.php?t=348137

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour,
    Voilà ma table.
    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
     
     
    ID_TRRCVDOC                          int(10)   auto_increment              
    DATE_CREATION_DOC              varchar(6) latin1_swedish_ci   
    HEURE_CREATION_DOC            varchar(5) latin1_swedish_ci   
    DATE_RECEPTION_DOC             varchar(6) latin1_swedish_ci   
    HEURE_RECEPTION_DOC           varchar(5) latin1_swedish_ci   
    DATE_TRADUCTION                  varchar(6) latin1_swedish_ci   
    HEURE_TRADUCTION                varchar(5) latin1_swedish_ci   
    NUM_INTERCHANGE                  varchar(14) latin1_swedish_ci   
    NUM_CONTROLE_DOC               varchar(14) latin1_swedish_ci   
    NUM_MESSAGE                         varchar(20) latin1_swedish_ci      
    CODE_STATUT_1                      char(1) latin1_swedish_ci                    
    CODE_STATUT_2                      char(1) latin1_swedish_ci                    
    CODE_ERREUR                         varchar(5) latin1_swedish_ci      
    ADDRESSE_EMETTEUR              varchar(35) latin1_swedish_ci      
    ADDRESSE_DESTINATAIRE       varchar(35) latin1_swedish_ci      
    ADDRESSE_ROUTAGE               varchar(20) latin1_swedish_ci        
    CONNEXION                             char(1) latin1_swedish_ci                     
    TYPE_MESSAGE                        varchar(6) latin1_swedish_ci      
    VERSION                                  char(3) latin1_swedish_ci
    Sur cette table, je fais:
    - Un update du champs CODE_STATUT_1 si l'enregistrement existe déjà.
    - Sinon, je fais un INSERT de l'enregistrement

    Je fais ceci pour environ 7000 enrefitrement provenant d'un fichier txt.

    Le traitement prend plus de 6 minutes ??

    Voici mes deux requêtes SQL:
    UPDATE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE $Table SET $ChampsNewValeur=\'$NewValeur\' WHERE $ChampsCle=\'$Cle\'
    INSERT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO $table VALUES('val1','val2','val3','val4',...,'val19');
    Voilà, je voudrais savoir pourquoi c'est aussi long, je dois probablement faire une erreur.

  5. #5
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    C'est normal, il n'y a aucun index sur tes colonnes (et l'id n'est pas en clé primaire )

    Je tte un oeil ici : http://mysql.developpez.com/faq/?pag...miser_requetes

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Alors,
    J'ai mis une clé primaire sur mon champs ID_TRRCVDOC (je pensais que cété fait, où plutôt je pensais que le fait de mettre auto_incrément, cété pareil que de mettre clé primaire).

    Ensuite j'ai mis un index sur le champs NUM_MESSAGE car c'est sur cet "axe" que je fait mes requetes SELECT et d'après la faq c'est ce qu'ilfaut faire (confirmation ?).

    Je lance mon script et vous dit ça a été plus vite ....
    Aller, rouuuulez jeunessseee !!!!!!!

  7. #7
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par LE NEINDRE
    (je pensais que cété fait, où plutôt je pensais que le fait de mettre auto_incrément, cété pareil que de mettre clé primaire).
    Non, une colonne non clé primaire peut être en auto incrément.

    Ensuite j'ai mis un index sur le champs NUM_MESSAGE car c'est sur cet "axe" que je fait mes requetes SELECT et d'après la faq c'est ce qu'ilfaut faire (confirmation ?).
    Oui, enfin il faudrait mettre un indes sur la colonne qui dans ta requête correspond à $ChampsCle.

    Je lance mon script et vous dit ça a été plus vite ....
    Aller, rouuuulez jeunessseee !!!!!!!

    Par curiosité, quel est le gain de temps approximatif ?

    PS : Merci de cliquer sur [Résolu] si c'est le cas.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    J'halluciiiiiinnnnnnnnnnnneeeee!!!!!!!!!!!!!!!

    Avant modif: 7:03 minutes
    après modif: 4 secondes !!!!!!!!!!!!!!!!!!!!!!!!!!!!




    Je suis ému

    Un grand merci maximilian !!!! Un très grand merci !!!

  9. #9
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Quand on vous dit qu'il faut lire la FAQ ...

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

Discussions similaires

  1. [PERL/MYSQL] Temps de process interminable !!
    Par LE NEINDRE dans le forum SGBD
    Réponses: 7
    Dernier message: 22/10/2008, 12h45
  2. Utilisation JProgressBar & temps de traitement incconu
    Par greg1602 dans le forum Composants
    Réponses: 22
    Dernier message: 30/11/2005, 20h52
  3. [Tableaux] Temps de traitement ... affichage de page
    Par mathieu77186 dans le forum Langage
    Réponses: 37
    Dernier message: 25/10/2005, 17h45
  4. [Perf]Utilisation des Logger et temps de traitement ?
    Par elitost dans le forum Logging
    Réponses: 6
    Dernier message: 12/04/2005, 23h13
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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