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

PHP & Base de données Discussion :

Optimisation d'un traitement arrêté par mon hébergeur [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Optimisation d'un traitement arrêté par mon hébergeur
    Bonjour,

    Je suis chez ovh et j'ai un traitement de suppression de doublons sur une table de 30 000 enregistrements quid ure trop longtemps. OVH me déconnecte avant la fin.

    Voici mon traitement

    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
    $select="SELECT id_tiers, $doublon 
    		 FROM $table 
    		 order by $doublon";
    $resultat=mysql_query($select);
    while($ligne=mysql_fetch_array($resultat))
    {
     
    	$ligne["tiers_nom"]=addslashes($ligne["tiers_nom"]);
    	$ligne["tiers_adr1"]=addslashes($ligne["tiers_adr1"]);
    	// Recherche dans la table temporaire de l'existence de cet enregistrement
    	$sql = "SELECT * FROM tabletemp 
    			WHERE tiers_nom = '".$ligne["tiers_nom"]."'
    			AND tiers_adr1 = '".$ligne["tiers_adr1"]."'";
     
    	$requete=mysql_query($sql);
    	while($line=mysql_fetch_array($requete))
    	{
    		$req = "UPDATE $table 
    				SET tiers_cpt_banque = '".$line["id_tiers"]."'
    				WHERE id_tiers = '".$ligne["id_tiers"]."'";
     
    		mysql_query($req);
    	}
    }
    Est-il possible de l'optimiser ?

    Merci d'avance

  2. #2
    Membre émérite Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Par défaut
    sans parler de l'optimiser (j'ai pas lu le code ) tu peux rajouter ini_set("max_execution_time", "300"); au début de ton fichier.
    Au lieu d'être déconnecté au bout de 30 secondes, tu sera déconnecté au bout 5 minutes... normalement ça devrait suffir

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Par défaut
    L'optimiser je ne sais pas mais en désespoir de cause il existe une petite feinte pour contourner le timeout avec ce genre de traitement.

    Faire le traitement en plusieurs fois : un compteur limite le nombre de doublons traités et rappelle la page une fois le nombre limite atteint.

    La condition de sortie sera la non présence de doublons.
    Ce n'est pas propre, mais ca m'avait sauvé la vie dans un cas similaire une fois

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    Je ne comprends pas le code, en particulier ces deux lignes qui ne font pas partie de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ligne["tiers_nom"]=addslashes($ligne["tiers_nom"]);
    $ligne["tiers_adr1"]=addslashes($ligne["tiers_adr1"]);
    A moins qu'elles ne soient contenues dans $doublon ?

    D'où ma question : quelle est la structure de cette variable / objet ?

    Et mon but : effectuer une requête qui ne repère que les doublons réels, sans avoir à balayer toute la table. Cela doit être faisable en utilisant les GROUP BY et HAVING COUNT.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Par défaut
    Après réflexion je me demande : ne serait ce pas plus efficace de lister la table temporaire et de vérifier l'existence dans la table finale, plutot que l'inverse ?

    En général les tables temporaires sont moins grosses, donc le traitement en serait diminué.

  6. #6
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Citation Envoyé par jml94
    Salut,

    Je ne comprends pas le code, en particulier ces deux lignes qui ne font pas partie de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ligne["tiers_nom"]=addslashes($ligne["tiers_nom"]);
    $ligne["tiers_adr1"]=addslashes($ligne["tiers_adr1"]);
    A moins qu'elles ne soient contenues dans $doublon ?

    D'où ma question : quelle est la structure de cette variable / objet ?

    Et mon but : effectuer une requête qui ne repère que les doublons réels, sans avoir à balayer toute la table. Cela doit être faisable en utilisant les GROUP BY et HAVING COUNT.

    Dans l'ancienne base que je récupère, il n'y avait aucun contrôle. Donc dans les champs "TEXT" ou "VARCHAR", il y a plein de caractères bizaroïde qui font que la requête se plante. En mettant "addslashes", je protège tous les caractères spéciaux.

    La base temporaire est effectivement plus petite, elle contient moins de 7 000 enregistrements. Elle a été constituée avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $strsql = "CREATE TABLE tabletemp SELECT DISTINCT * FROM t_tiers group by tiers_nom, tiers_adr1";
    mysql_query( $strsql);
    J'ai 3 tables qui sont liés sur les enregistrements de "$table=t_tiers".

    J'ai donc ensuite un traitement par table lié pour connecter chaque enregistrement vers l'enregistrement de t_tiers restant. C'est pourquoi j'utilise un champ non utilisé "tiers_cpt_banque" pour garder le nouveau lien.

    J'espère avoir été plus clair.

    Merci

  7. #7
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par lodan
    Dans l'ancienne base que je récupère, il n'y avait aucun contrôle. Donc dans les champs "TEXT" ou "VARCHAR", il y a plein de caractères bizaroïde qui font que la requête se plante. En mettant "addslashes", je protège tous les caractères spéciaux.

    ...

    J'espère avoir été plus clair.
    Hélas non, mais peut-être que ma question ne l'était pas non plus.

    Je vouslais dire que je ne vois aucune trace des colonnes "tiers_nom" et "tiers_adr1" dans la requête.
    J'en déduisais qu'elles doivent être dans $doublon...
    Donc il ressemble à quoi ce $doublon ?

  8. #8
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Citation Envoyé par jml94
    Hélas non, mais peut-être que ma question ne l'était pas non plus.

    Je vouslais dire que je ne vois aucune trace des colonnes "tiers_nom" et "tiers_adr1" dans la requête.
    J'en déduisais qu'elles doivent être dans $doublon...
    Donc il ressemble à quoi ce $doublon ?
    Tu me fais douter.

    Dans ma requête c'est quoi ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = "SELECT * FROM tabletemp 
    			WHERE tiers_nom = '".$ligne["tiers_nom"]."'
    			AND tiers_adr1 = '".$ligne["tiers_adr1"]."'";
    Ce n'est pas l'utilisation des colonnes "tiers_nom" et "tiers_adr1" ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/06/2014, 09h49
  2. Les processus créés par system() ne sont pas arrêtés quand mon service windows stoppe
    Par Glavio dans le forum Programmation et administration système
    Réponses: 6
    Dernier message: 30/04/2012, 22h25
  3. Réponses: 5
    Dernier message: 11/03/2005, 16h48
  4. Détection passerelle par mon provider
    Par devmat dans le forum Réseau
    Réponses: 4
    Dernier message: 20/01/2005, 11h41
  5. Comment faire générer du rtf par mon application?
    Par nickylarson dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/08/2003, 09h35

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