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 de script


Sujet :

PHP & Base de données

  1. #1
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut Optimisation de script
    Bonjour pour tout le monde,

    j'ai un problème avec un temps maximal d'exécution dépassé. Le but de mon script est de copier des données Oracle d'une base distante dans ma base MySQL locale. Je dois utiliser des commandes OCI pour extraire les données issues de la base Oracle. J'effectue donc un SELECT des données de ma base Oracle dans le but de les lire puis j'insers ces données dans ma base MySQL (script en PS), mais forcément c'est long et le temps d'exécution maximale est dépassé... Je ne peux pas augmenter ce temps car je n'ai aucun droit sur le serveur! J'arrive à copier le dixième de ce que je devrais copier...

    Serait-il possible d'effectuer une insertion à partir d'une selection, je m'explique. Peut-on faire une requête SQL du genre INSERT (dans ma base MySQL d'une autre commande SQL SELECT (les données de la base Oracle)) ?????

    Merci d'avance de vos réponses, car la je suis bloqué et je n'ai plus vraiment de piste...

    ++


    PS: Voici ma boucle while qui a un temps d'exécution beaucoup trop long :

    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
      $lala=ociparse($c,"SELECT * FROM ops WHERE DDATE='2453912'");
     
    ociexecute($lala,OCI_DEFAULT);
     
     
     
    while (ocifetch($lala)) {
     
                $syscaa=ociresult($lala,2);
     
                $gps=ociresult($lala,3);
     
                $sgtqs=ociresult($lala,4);
     
                $numes=ociresult($lala,5);
     
                $nbr=ociresult($lala,6);
     
                $sql="insert INTO historique (DDATE,SYSCAA,GPS,SGTQS,NUMES,NBR) VALUES ('ociresult($lala,1)','$syscaa','$gps','$sgtqs','$numes','$nbr')";
     
                $res = mysql_query($sql) or die ("requete incorrecte au niveau des statistiques du jour");
     
    }
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    As-tu essayé set_execution_time(0); ?

    D'une côté, tu peux essayer d'améliorer le temps d'exécution de ton script en utilisant PDO (surtout pour l'INSERT).
    D'un autre côté, tu peux tenter les INSERT étendus. Concatène dans la boucle afin d'obtenir une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO `table`
      (`champ_1`, `champ_2`, `champ_3`)
    VALUES
      ("valeur 1-1", "valeur 1-2", "valeur 1-3"),
      ("valeur 2-1", "valeur 2-2", "valeur 2-3"),
      ("valeur 3-1", "valeur 3-2", "valeur 3-3"),
      ("valeur 4-1", "valeur 4-2", "valeur 4-3");
    Si cela ne fonctionne pas, tu devras utiliser une méthode plus complexe pour sélectionner les tuples. Je te l'expliquerai si tu en as besoin.

  3. #3
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    La fonction set_execution_time() n'est pas activée sur le serveur. De plus, j'aimerais améliorer le temps de réponse, car la en 30 secondes je telecharges 500 données environ avant que le message d'erreur ne s'affiche et vu que j'ai environ 10.000 données a copier, cela representerait environ 20 minutes et ça commencerait a faire beaucoup...

    "D'une côté, tu peux essayer d'améliorer le temps d'exécution de ton script en utilisant PDO (surtout pour l'INSERT)."
    Qu'est-ce que PDO?

    Comment puis-je faire un INSERT étendu, étant donné que je dois insérer des données suite à une sélection?

    "Si cela ne fonctionne pas, tu devras utiliser une méthode plus complexe pour sélectionner les tuples"
    Ca m'a lair déjà des concepts compliqués ça...

    Merci de votre intérêt.
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Donc, si je résume :
    • Tu ne t'es pas renseigné sur mes propositions
    • Elles ne seraient de toute manière pas viables (il ne s'agit pas d'optimisation dans ton cas mais plutôt de changer complètement d'approche)

    Je vais te donner une méthode qui fonctionne à coup sûr mais cela va demander pas mal d'investissement de ta part car je n'aurai pas le temps de tout faire pour toi.

    J'ai mis à disposition [ici] un script qui fait quelque chose de similaire pour un forum phpBB, quelle que soient la taille de la BDD et les paramètres de l'hébergeur. Je vais te décrire la méthode adoptée.


    L'idée est d'extraire les tables petit à petit, en plusieurs exécutions du script.
    1. Il faut déterminer quels sont les champs qui composent la clef primaire et effectuer une sélection en ordonnant les tuples par ces champs.
    2. Extrais ces données, construis la requête d'insertion et insère les tuples.
    3. Lorsque tu vois que le script arrive vers la fin de son exécution, tu arrêtes l'opération et tu notes où tu en es dans une table spécialement prévue pour le suivi. Dans mon script, comme je travaille avec MySQL, je gère tout cela à l'aide de l'instruction LIMIT et du nombre de tuples récupérés. Je ne sais pas si Oracle le permet.
    4. Relance le script. Il doit être capable de récupérer les tuples suivants, toujours ordonnés selon les champs de la clef primaire et de te retourner les tuples à partir d'où tu en étais.

    Si tu as des questions, n'hésite pas à les poser ici.
    Bonne chance !

  5. #5
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Merci de ton aide, je vais bosser ce que tu m'as donné et je poste d'ici peu pour dire ou j'en suis en espèrant que l'avancement sera positif!
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  6. #6
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Il n'y a pas de clefs primaires dans la table Oracle que je dois télécharger, comment puis-je faire pour suivre l'avancement du téléchargement??? Car si j'ai bien compris, le but est de télécharger les données Oracle vers un fichier texte et une fois que la limite de temps est atteinte, on arrête et on recommence où on était arrivé, c'est cela? C'est embêtant de devoir mettre un bouton pour cliquer et lancer la suite du téléchargement, ce serait mieux qu'il fasse automatiquement, mais c'est mieux que rien...

    Il faut installer quelque chose sur le serveur? Car je n'ai aucun droit sur le serveur??? Qu'est-ce que phpBB???

    Merci
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Qu'est-ce que c'est que cette base Oracle qui n'a pas de clefs primaires ?
    Non, le but n'est pas de télécharger vers un fichier texte mais de construire une grosse requête unique (une requête étendue contenant plusieurs insertions en une fois, cf. la doc MySQL) que tu exécutes à la fin de l'exécution du script.

    Pour l'automatisme, tu peux certainement le faire avec un META refresh ou un peu de JS : le bouton est facultatif. Il suffit d'être inventif.

    Si tu ne sais pas ce qu'est phpBB, cela n'a pas d'importance. Note quand même que lui nous dédié un forum...

    Sincèrement, sans clefs primaires, je vois mal comment tu pourras t'en sortir. Il y a des clefs uniques, au moins ?

  8. #8
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Nan je ne pense pas qu'il n'y ait de clefs uniques non plus...
    D'après ce que je sais sur la base, chaque jour on y ajoute des données, et moi je dois télécharger les données de la veille, ma sélection s'effectue sur la date, et cela fait beaucoup de données...

    Tu ne penses pas qu'il y aurait moyen de télécharger les données dans un fichier texte au format CSV sur mon disque dur, pour ensuite les ajouter sur ma base locale MySQL à partir de ce fichier texte de mon disque dur (la dernière partie je l'ai déjà faite)???
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  9. #9
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Je viens d'avoir une idée. Serait-il possible d'enregistrer toutes mes données dans des tableaux, puis de faire un gros insert. Je m'explique...

    Je ferai mon SELECT de mes données de ma base Oracle,
    puis dans mon while {
    je copierai mes données dans des tableaux différents pour chaque colonne, tab_col1[],tab_col2[],tab_col3[]...
    }
    puis je lancerai le gros INSERT du genre
    INSERT INTO ma_base_MySQL (col1,col2,col3) VALUES (tab_col1[1],tab_col2[1],tab_col3[1]) (tab_col1[2],tab_col2[2],tab_col3[2]) ...

    J'espère que j'ai assez bien expliqué, penses-tu que cela pourrait fonctionner???
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  10. #10
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    En fait il suffit de copier les données dans les tableaux, si cette action prends moins de 30 secondes c'est bon... Car après le "gros insert", je peux le découper en plusieurs fois, 100 données par 100 données par exemple, car j'en ai 2000-3000 à copier par table, tout cela fois 3 et tous les jous...

    Mais le principe de copier les données dans des tableaux c'est pas mal nan? Par contre si ça marchait, je peux créer un tableau avec une longueur non définie? je pense que oui, si c'est vraiment le cas, je peux en connaître la longueur maximale?
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  11. #11
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    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
    while (ocifetch($resultat)){
    	$DDATE=ociresult($resultat,1);
    	$SYSCAA=ociresult($resultat,2);
    	$GPS=ociresult($resultat,3);
    	$SGTQS=ociresult($resultat,4);
    	$NUMES=ociresult($resultat,5);
    	$NBR=ociresult($resultat,6);
    	$tab_ddate = array($index => "$DDATE");
    	$tab_syscaa  = array($index => "$SYSCAA");
    	$tab_gps = array($index => "$GPS");
    	$tab_sgtqs = array($index => "$SGTQS");
    	$tab_numes = array($index => "$NUMES");
    	$tab_nbr = array($index => "$NBR");	
    	//echo $tab_ddate[$index];echo' ';
    	//echo $tab_syscaa[$index];echo' ';
    	//echo $tab_gps[$index];echo' ';
    	//echo $tab_sgtqs[$index];echo' ';
    	//echo $tab_numes[$index];echo' ';
    	//echo $tab_nbr[$index];echo' ';
    	//echo '<br>';
    	$index=$index+1;
    }
    echo $index;echo '<br>';
    echo $tab_ddate[4];
     
    //include ('connexion_pems.ini');
    //for ($i=1; $i <= 50; $i++) {
    //echo $tab_ddate[$i];
    	//$sql="insert INTO historique (DDATE,SYSCAA,GPS,SGTQS,NUMES,NBR) VALUES ('$tab_ddate[$i]','$tab_syscaa[$i]',
    	//	'$tab_gps[$i]','$tab_sgtqs[$i]','$tab_numes[$i]','$tab_nbr[$i]')";
    	//$res = mysql_query($sql) or die ("requete incorrecte au niveau de la copie de donnees a partir de ICB");
    //}

    Voila à quoi ressemblerait mon code à peu prés au final, donc j'arrive bien à copier les données dans différents tableaux, l'index maximale je le connais $index, je pourrais donc morceler mes include, mais j 'ai 2 questions.

    Le temps maximal d'execution c'est sur le script ou sur la boucle? car la le copiage de mes données dans les tableaux prends quasiment 30 secondes (4665 données a faire 3 fois arf), donc ca ferait beaucoup trop short! Si les 30 secondes c'est sur le script, comment puis-je faire?

    j'ai un problème c'est que "echo $tab_ddate[4];" ne m'affiche rien...
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  12. #12
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    la balise code c'est en cliquant sur #, mais en mettant #...

  13. #13
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    dsl, qqun peut-il me répondre svp...
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Disons que le problème se situe au niveau de la quantité de données à récupérer. Il faut réduire a quantité de tuples retournés par le SELECT, sans quoi tu auras toujours le problème de timeout.

    Il faut que tu trouves un moyen fiable d'ordonner les données. Normalement, le schéma de la base te permet de le faire aisémanet à l'aide des clefs primaires. Si tu as une date d'insertion dans chaque table, tu peux l'utiliser. Si tu n'as rien de tout cela, j'ai peur que tu doives demander conseil aux gens qui gèrent la BDD.

    Par ailleurs, peut-être que les gens du forum SGBD auront de meilleures réponses que moi.

  15. #15
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    J'essaye de réduire le nombre de données à insérer, du coup j'ai fait des filtres avant les insertions, mon code ressemble à celui-ci maintenant :

    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
    while (ocifetch($resultat)){
    	$DDATE=ociresult($resultat,1);
    	$SYSCAA=ociresult($resultat,2);
    	$GPS=ociresult($resultat,3);
    	$SGTQS=ociresult($resultat,4);
    	$NUMES=ociresult($resultat,5);
    	$NBR=ociresult($resultat,6);
     
    	//On interroge la base locale MySQL locale pour ne sélectionner   
    	$requete_seuil = "SELECT * FROM seuil WHERE Mess='$NUMES' AND Priorite!=''";
    	$resultat_seuil = mysql_query($requete_seuil) or die ("requete incorrecte au niveau de la recuperation de donnees a partir de la table seuil");
    	$row_seuil = mysql_fetch_array($resultat_seuil);
    	$Seuil=$row_seuil['Seuil'];
    	$Priorite=$row_seuil['Priorite'];	
    	$Libelle=$row_seuil['Libelle'];
    	$FicheAQF=$row_seuil['FicheAQF'];
    	$Position=$row_seuil['Position'];
    	$Domaine=$row_seuil['Domaine'];
    	//Comparaison du seuil entre la table Historique et la table Seuil
    	if ($NBR > $Seuil){		
    		//Mise a jour des donnees dans les tables volum_faute1,2,3,4
    		if ($Priorite=='Faute1' OR $Priorite=='faute1') {				
    			$sql = "INSERT INTO volum_faute1 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute1','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute1");
    			$id_faute1=$id_faute1+1;
    		}
    		if ($Priorite=='Faute2' OR $Priorite=='faute2') {
    			$sql = "INSERT INTO volum_faute2 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute2','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute2");
    			$id_faute2=$id_faute2+1;
    		}
    		if ($Priorite=='Faute3' OR $Priorite=='faute3') {
    			$sql = "INSERT INTO volum_faute3 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute3','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute3");
    			$id_faute3=$id_faute3+1;
    		}
    		if ($Priorite=='Faute4' OR $Priorite=='faute4') {
    			$sql = "INSERT INTO volum_faute4 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute4','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute4");
    			$id_faute4=$id_faute4+1;
    		}
    	}
    }
    Je copie 2500 données sur 4000 environ :/ . Le problème c'est que je ne peux pas diminuer la première selection, sauf si je faisais une jointure, je peux en faire une entre une base Oracle et MySQL? Là j'effectue un 1er filtre au niveau de la requête dans le WHILE, puis au niveau de mon if ... C'est pas encore suffisant malheureusement...
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  16. #16
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut Optimisation de requête
    Bonjour tout le monde,

    j'ai un problème au niveau de requête, je dois copier environ 4000 données par jour et je n'arrive à n'en copier que 2500, car le temps d'exécution maximal de 30 secondes (que je ne peux augmenter!!!) est dépassé. Les données que je dois copier proviennent d'un serveur Oracle que je dois copier sur mon serveur locale MySQL. Est-il possible de faire une jointure entre 2 bases de ce type? Mon code est le suivant :

    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
    include ('date_format_julien.php');
    $resultat=ociparse($c,"SELECT * FROM HISTORIQUE1 WHERE DDATE='$jour_format_julien'");
    ociexecute($resultat,OCI_DEFAULT);
    include ('connexion_pems.ini');
    $id_faute1=1;
    $id_faute2=1;
    $id_faute3=1;
    $id_faute4=1;
    $i=1;
     
    while (ocifetch($resultat)){
    	$DDATE=ociresult($resultat,1);
    	$SYSCAA=ociresult($resultat,2);
    	$GPS=ociresult($resultat,3);
    	$SGTQS=ociresult($resultat,4);
    	$NUMES=ociresult($resultat,5);
    	$NBR=ociresult($resultat,6);
     
    	//On interroge la base locale MySQL locale pour ne sélectionner   
    	$requete_seuil = "SELECT * FROM seuil WHERE Mess='$NUMES' AND Priorite!=''";
    	$resultat_seuil = mysql_query($requete_seuil) or die ("requete incorrecte au niveau de la recuperation de donnees a partir de la table seuil");
    	$row_seuil = mysql_fetch_array($resultat_seuil);
    	$Seuil=$row_seuil['Seuil'];
    	$Priorite=$row_seuil['Priorite'];	
    	$Libelle=$row_seuil['Libelle'];
    	$FicheAQF=$row_seuil['FicheAQF'];
    	$Position=$row_seuil['Position'];
    	$Domaine=$row_seuil['Domaine'];
    	//Comparaison du seuil entre la table Historique et la table Seuil
    	if ($NBR > $Seuil){		
    		//Mise a jour des donnees dans les tables volum_faute1,2,3,4
    		if ($Priorite=='Faute1' OR $Priorite=='faute1') {				
    			$sql = "INSERT INTO volum_faute1 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute1','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute1");
    			$id_faute1=$id_faute1+1;
    		}
    		if ($Priorite=='Faute2' OR $Priorite=='faute2') {
    			$sql = "INSERT INTO volum_faute2 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute2','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute2");
    			$id_faute2=$id_faute2+1;
    		}
    		if ($Priorite=='Faute3' OR $Priorite=='faute3') {
    			$sql = "INSERT INTO volum_faute3 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute3','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute3");
    			$id_faute3=$id_faute3+1;
    		}
    		if ($Priorite=='Faute4' OR $Priorite=='faute4') {
    			$sql = "INSERT INTO volum_faute4 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute4','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute4");
    			$id_faute4=$id_faute4+1;
    		}
    	}
    }
    Je ne peux pas diminuer le nombre de données que je selectionne dans ma premiére requête, car je dois télécharger toutes les données sur le jour de la veille, j'effectue donc un premier filtre sur ma requête dans ma bouche, puis un second filtre avec ma condition if... Si vous voyez un moyen d'optimiser cela, je vous remercirai de m'éclairer.
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  17. #17
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    pas de réponse, bonne réponse?! nan dans ce cas-là ça marche pas lol, personne n'a un petit coup de main à me donner svp...
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  18. #18
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je te l'ai dejà dit : il faut que tu trouves un moyen de réduire le nombre de tuples retournés par ta requête et que tu lances plusieurs exécutions. Je t'ai proposé de jouer avec les clef primaires. S'il n'y en a pas, je t'assure que ce n'est pas une situation normale (surtout avec Oracle) et que l'optimisation doit être faite du côté du schéma de la BDD.

  19. #19
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Salut,

    oui j'essaye de diminuer le nombre de données, je voudrais faire une jointure ca me paraît être la meilleur solution, mais je ne pense pas que ce soit possible entre une base Oracle et une base MySQL, car là ça ne fonctionne pas...

    Une solution qui pourrait marchez aussi c'est de tout copier dans des tableaux, ça ne dépasse pas les 30 secondes, de fermer la connexion avec Oracle, puis de faire les INSERT. Mais sur ce sujet j'ai une autre question : la fameuse limite des 30 secondes concerne l'exécution de mon script PHP, de ma boucle WHILE ou de ma connexion avec Oracle?

    La dernière solution que j'ai mise en oeuvre actuellement c'est d'effectuer des tris dans la boucle, mais c'est trop et par conséquent, ça n'est pas une solution viable, donc il faut que je me rabbates sur la jointure ou sur les tableaux pour moi...
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  20. #20
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    La limite de 30 secondes s'applique au temps d'exécution du script complet.

    Je ne suis pas certain de comprendre le même concept de jointure que toi. Il s'agit de deux connexions complètement différentes : comment peux-tu espérer les faire dialoguer ? Ce n'est pas la bonne démarche.
    Il faut que tu récupères les tuples en un temps raisonnable (moins de la moitié des 30 secondes) afin de te permettre de les enregistrer ailleurs dans le temps qu'il reste.

    Je le répète, le schéma de la BDD n'est assurément pas correct. Les gens du forum Oracle pourront probablement mieux t'orienter que nous, puisqu'il ne s'agit pas de PHP mais d'un SGBD particulier.

Discussions similaires

  1. [MySQL] Optimisation de scripts PHP/MySQL
    Par DgG dans le forum PHP & Base de données
    Réponses: 368
    Dernier message: 20/11/2013, 18h59
  2. Optimiser vos scripts
    Par djibril dans le forum Langage
    Réponses: 33
    Dernier message: 11/06/2009, 16h10
  3. Optimisation shell script
    Par Burrito dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 30/08/2006, 22h12
  4. [Débutant] Accélérer et optimiser ses scripts PHP
    Par Metallic-84s dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2006, 12h37
  5. [MySQL] [Script]Optimisation de scripts Php/MySQL (2)
    Par copy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/08/2004, 08h33

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