$reqazemp=mysql_query("select $tabledtgrp.CODE_ELT, $tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir, $reference.$tabledtgrp, $reference.$tablegrp where $tablegrp.code_regroupt='zemp' and $tablegrp.type_elt='comm' and $tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date' and $tabledtgrp.date_sortie >= '$date' and $tabledtgrp.TYPE_ELT='comm' and $tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and $nomtablesir.INSEE=$tabledtgrp.CODE_ELT");
if (!$reqazemp)
{ die('Requête invalide A ZEMP: ' . mysql_error());
exit(); }
if ($reqazemp)
{ echo "OK REQ A ZEMP";}
while ($datazemp = mysql_fetch_array($reqazemp))
{
$reqbzemp=mysql_query("update $sirene.$nomtablesir set ze='$datazemp[CODE_GROUPE]' where INSEE='$datazemp[CODE_ELT]' and DATE='$fich'"); }
if (!$reqbzemp)
{ die('Requête invalide B ZEMP: ' . mysql_error()); exit();}
if ($reqbzemp)
{ echo "OK REQ B ZEMP";}
j'aimerais savoir comment optimiser le temps d'execution des requêtes, car ces requetes fonctionnent très bien si j'ai 50 lignes (ça va assez vite), mais j'ai essayé avec un fichier de 40 000 lignes et là ça met un paquet de temps (a vrai dire je ne sais même pas combien car ça ne c'est pas terminé encore ...) et j'ai peur que ça bug pour finir !!!
Donc est-ce que quelqu'un à une methode qui permet d'accelèrer les requêtes ???
Merci d'avance !
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 1 sept. 2005 à 15:25
encore une petite chose, j'execute à la suite de ces deux premières requetes deux autres identiques (enfin presque!!) donc je me demande si le mysql_close(); est bien nécessaire ici ??
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 1 sept. 2005 à 16:53
En fait, j'interroge 4 tables :
1 table avec 40000 lignes (table à updater), 1 table de 72000 lignes, 1 table de 46 000 lignes et la dernière 75 lignes et donc c'est peut etre pour cela mais je me demande si mes requêtes sont vraiment optimales !!!
car je fais un select puis un update donc j'ai l'impression qu'il met du temps à gérer ça !!!
merci de ton aide quand même !!!
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 2 sept. 2005 à 09:13
Alors j'ai changé ma structure de table un peu (j'ai mis un id_unique) mais ce qui est bizarre est que ma base est désormais bien updater mais par contre il ne vient pas sur ma page de fin en gros qu'il ne s'arrête pas ou je sais pas trop !!
Donc là il met bien à jours ma table sirene, pour le champ EPCI mais mon problème est qu'il ne me dit jamais quand il a fini (il vient pas sur la page finenrichir.php, et qu'en plus normalement j'ai le même type de requête ensuite pour updater d'autre champ etça ça ne marche pas j'ai l'impression que mes 1ères requêtes ne terminent pas où je sais pas !!!
J'en peux plus je craque !!!
Pour que se soit plus simple voici mes pages php :
1er php : sélection du fichier à traiter et d'une date
<FORM method= "post" action="finenrichir.php">
Entrer la date de découpage souhaitée au format (aaaa-01-01) ou bien prendre le dernier découpage :
<?
$date_par_defaut=date("Y-d-m");
?>
<TD bgcolor=#FFCC99>
<?
if ( ! isset($date) )
{ $date=$date_par_defaut;
session_register("date");
}
echo "
"; ?>
Sélectionnez le fichier à enrichir :
<!- Valider ->
</FORM>
Donc ce 1er formulaire lance les requêtes sur ma page 2 :
$hostname="srv-msg.net";
$username="user";
$password="pwduser";
$reference="CNXGlob";
$sirene="sirene";
$tablegrp="groupes";
$tabledtgrp="det_grp";
$nomtablesir="sirene";
$fich = basename (substr ($newfichier, 0, -4));
echo $fich;
echo $date;
$link=mysql_connect($hostname, $username, $password);
if (!mysql_connect($hostname, $username, $password))
{
echo "ERREUR PASSWORD SERVEUR";
}
//VERIFICATION CONNEXION BASE
if (!mysql_select_db($reference, $link))
{
echo "ERREUR BASE REFERENCE";
exit();
}
if (!mysql_select_db($sirene, $link))
{
echo "ERREUR BASE SIRENE";
exit();
}
?>
<?php
//DECLARATION POUR EPCI
$reqaepci=mysql_query("select $nomtablesir.id_unique, $tabledtgrp.CODE_ELT, $tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir, $reference.$tabledtgrp, $reference.$tablegrp where $tablegrp.code_regroupt='epci' and $tablegrp.type_elt='comm' and $tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date' and $tabledtgrp.date_sortie >= '$date' and $tabledtgrp.TYPE_ELT='comm' and $tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and $nomtablesir.INSEE=$tabledtgrp.CODE_ELT");
if (!$reqaepci)
{ die('Requête invalide : ' . mysql_error());
exit(); }
if ($reqaepci)
{ echo "OK REQ A EPCI";}
//$dataepci = mysql_fetch_array($reqaepci);
while ($dataepci = mysql_fetch_array($reqaepci))
{
$reqbepci=mysql_query("update $sirene.$nomtablesir set epci='$dataepci[CODE_GROUPE]' where $dataepci[id_unique]");
}
if (!$reqbepci)
{ die('Requête invalide B ECPI: ' . mysql_error()); exit();}
if ($reqbepci)
{ echo "OK REQ B EPCI";}
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 2 sept. 2005 à 09:23
je crois vraiment qu'il y a un truc qui tourne sans arret car lorsque je fais un UPDATE sirene set epci=' ' pour tout enlever pour recommencer, 30 secondes après j'ai a nouveau des données dans mon champs !!!!
je crois que je dois avoir une merde dans mon programme c'est pas possible !!!
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 2 sept. 2005 à 10:08
Ok merci pour cette structure,
déjà remplace InnoDB par MyISAM, ensuite enlève la clé primaire pour ne laisser que la clé unique, un seul index suffit.
Pour le reste ta requête c'est ça, mais ça donne quoi en réalité (qu'on voit sur quelles tables la requête intervient) ?
$reqazemp=mysql_query("select $tabledtgrp.CODE_ELT,
$tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir,
$reference.$tabledtgrp, $reference.$tablegrp where
$tablegrp.code_regroupt='zemp' and $tablegrp.type_elt='comm' and
$tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date'
and $tabledtgrp.date_sortie >= '$date' and
$tabledtgrp.TYPE_ELT='comm' and
$tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and
$nomtablesir.INSEE=$tabledtgrp.CODE_ELT");
Ensuite donne-nous la structure des autres tables mises en jeu stp
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 2 sept. 2005 à 10:35
alors pour l'instant j'ai pas remplacé ce que tu m'a dit (mais je vais le faire)!!!
mais mes requetes fonctionnent c'est à dire qu'il met bien à jours la table sirene (champ EPCI, ZEMP, AU, PAYS), lorsque je regarde dans ma table les infos sont bien mises (et assez rapidement) enfin j'ai l'impression par contre je crois qu'il n'arrête jamais de mettre à jours et je sais pas pourquoi il ne s'arrête pas.
Donc en définitive il met bien à jours ma table mais il me dit pas quand il a fini car j'ai l'impression qu'il ne s'arrête jamais ...!!
voici mon code complet avec mes différentes reqûêtes peut être (surement) que j'ai oublier de lui dire un truc!!
pourtant ce que je ne comprends pas c'est que lorsque je lui dit de mettre à jours une ligne (ex: date= sir2005s2) ça fonctionne bien et il me dit que les requetes on ben marché
Bon je fais les corrections que tu m'as dit !!!
En tout cas merci anthomicro !!!
je te mets aussi la structure des autre tables !!!
Voici mon code :
//VERIFICATION CONNEXION SERVEUR
$fich = basename (substr ($newfichier, 0, -4));
echo $fich;
echo $date;
$link=mysql_connect($hostname, $username, $password);
if (!mysql_connect($hostname, $username, $password))
{
echo "ERREUR PASSWORD SERVEUR";
}
//VERIFICATION CONNEXION BASE
if (!mysql_select_db($reference, $link))
{
echo "ERREUR BASE REFERENCE";
exit();
}
if (!mysql_select_db($sirene, $link))
{
echo "ERREUR BASE SIRENE";
exit();
}
?>
<?php
//DECLARATION POUR EPCI
$reqaepci=mysql_query("select $nomtablesir.id_unique, $tabledtgrp.CODE_ELT, $tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir, $reference.$tabledtgrp, $reference.$tablegrp where $tablegrp.code_regroupt='epci' and $tablegrp.type_elt='comm' and $tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date' and $tabledtgrp.date_sortie >= '$date' and $tabledtgrp.TYPE_ELT='comm' and $tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and $nomtablesir.INSEE=$tabledtgrp.CODE_ELT and $nomtablesir.DATE='$fich'");
if (!$reqaepci)
{ die('Requête invalide : ' . mysql_error());
exit(); }
if ($reqaepci)
{ echo "OK REQ A EPCI";}
while ($dataepci = mysql_fetch_array($reqaepci))
{
$reqbepci=mysql_query("update $sirene.$nomtablesir set epci='$dataepci[CODE_GROUPE]' where $dataepci[id_unique]");
}
if (!$reqbepci)
{ die('Requête invalide B ECPI: ' . mysql_error()); exit();}
if ($reqbepci)
{ echo "OK REQ B EPCI";}
?>
<?php
//DECLARATION POUR ZEMP
$reqazemp=mysql_query("select $nomtablesir.id_unique, $tabledtgrp.CODE_ELT, $tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir, $reference.$tabledtgrp, $reference.$tablegrp where $tablegrp.code_regroupt='zemp' and $tablegrp.type_elt='comm' and $tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date' and $tabledtgrp.date_sortie >= '$date' and $tabledtgrp.TYPE_ELT='comm' and $tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and $nomtablesir.INSEE=$tabledtgrp.CODE_ELT and $nomtablesir.DATE='$fich'");
if (!$reqazemp)
{ die('Requête invalide : ' . mysql_error());
exit(); }
if ($reqazemp)
{ echo "OK REQ A ZEMP";}
while ($datazemp = mysql_fetch_array($reqazemp))
{
$reqbzemp=mysql_query("update $sirene.$nomtablesir set ze='$datazemp[CODE_GROUPE]' where $datazemp[id_unique]");
}
if (!$reqbzemp)
{ die('Requête invalide B ZEMP: ' . mysql_error()); exit();}
if ($reqbzemp)
{ echo "OK REQ B ZEMP";}
?>
<?php
//DECLARATION POUR AU
$reqaau=mysql_query("select $nomtablesir.id_unique, $tabledtgrp.CODE_ELT, $tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir, $reference.$tabledtgrp, $reference.$tablegrp where $tablegrp.code_regroupt='au' and $tablegrp.type_elt='comm' and $tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date' and $tabledtgrp.date_sortie >= '$date' and $tabledtgrp.TYPE_ELT='comm' and $tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and $nomtablesir.INSEE=$tabledtgrp.CODE_ELT and $nomtablesir.DATE='$fich'");
if (!$reqaau)
{ die('Requête invalide A AU: ' . mysql_error());
exit(); }
if ($reqaau)
{ echo "OK REQ A AU";}
while ($dataau = mysql_fetch_array($reqaau))
{
$reqbau=mysql_query("update $sirene.$nomtablesir set au='$dataau[CODE_GROUPE]' where $dataau[id_unique]");
}
if (!$reqbau)
{ die('Requête invalide B AU: ' . mysql_error()); exit();}
if ($reqbau)
{ echo "OK REQ B AU";}
$reqapays=mysql_query("select $nomtablesir.id_unique, $tabledtgrp.CODE_ELT, $tablegrp.CODE_GROUPE, $nomtablesir.INSEE from $sirene.$nomtablesir, $reference.$tabledtgrp, $reference.$tablegrp where $tablegrp.code_regroupt='pays' and $tablegrp.type_elt='comm' and $tabledtgrp.date_geree='oui' and $tabledtgrp.date_entree <= '$date' and $tabledtgrp.date_sortie >= '$date' and $tabledtgrp.TYPE_ELT='comm' and $tabledtgrp.CODE_GROUPE=$tablegrp.CODE_GROUPE and $nomtablesir.INSEE=$tabledtgrp.CODE_ELT and $nomtablesir.DATE='$fich'");
if (!$reqapays)
{ die('Requête invalide A PAYS: ' . mysql_error());
exit(); }
if ($reqapays)
{ echo "OK REQ A PAYS";}
while ($datapays = mysql_fetch_array($reqapays))
{
$reqbpays=mysql_query("update $sirene.$nomtablesir set pays='$datapays[CODE_GROUPE]' where $datapays[id_unique]");
}
if (!$reqbpays)
{ die('Requête invalide B PAYS: ' . mysql_error()); exit();}
if ($reqbpays)
{ echo "OK REQ B PAYS";}
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 2 sept. 2005 à 11:23
Ajoute à ta table "sirene" un index sur le champ DATE et sur le champ INSEE
Ensuite pour ta table "det_grp
" ajoute
un index sur le champ code_regroupt, sur le champ type_elt, sur le
champ date_geree, sur le champ date_entree, sur le champ date_sortie,
sur le champ TYPE_ELT
Ensuite ajoute un index pour la table "groupes" sur le champ CODE_GROUPE
Enlève la clé primaire sur la table "groupes"
Voilà passe toutes tes tables en MyISAM ensuite. Teste ensuite la
différence des temps de génération et si t'as encore un problème stp
soit plus clair, ça fait 20 minutes que j'essaie de recouper tes
requetes. Maintenant que j'ai la structure de tes tables file-moi un
exemple pour les trois requetes
exemple : SELECT champ FROM table WHERE machin='truc' et pas
SELECT $machin.champ FROM $tablemachin WHERE $tablemachin.truc=$machin
c'est chiant pour s'y retrouver. Bref tu fais un echo de deux ou trois requetes et ça devrait aller.
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 2 sept. 2005 à 11:31
désolé c'est clair que j'ai pas été cool là dessus !!
Par contre, je peux pas trop modifié les tables det_grp et groupes car ce sont des tables standard utilisé par d'autre application, et j'ai pas trop envie de faire des manip dessus !!!
moi là ce qui m'étonne est que ça fonctionne bien et assez rapidement (il met bien les infos dans ma table sirene) mais il ne se termine jamais !!!!
j'en ai marre, j'ai essayé de changer la table sirene en MyISAM et depuis ça déconne !!! j'arrive plus à ouvrir ma base de données ça rame !!!!
Je comprends pas pourquoi ça marche très bien pour 40 lignes et que pour 40000 ça déconne !! que cela met plus de temps d'accord mais au bout d'un certains temps ça devrai s'arrêter !!!
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 2 sept. 2005 à 11:45
voici mes requetes en propre :
$date= 2005-01-0
$fich=sir2004s2
$reqa epci =mysql_query("SELECT sirene.id_unique, det_grp.CODE_ELT, groupes.CODE_GROUPE, sirene.INSEE
FROM sirene.sirene, cnxaudiarGlob.det_grp, cnxaudiarGlob.groupes
WHERE groupes.code_regroupt = ' epci '
AND groupes.type_elt = 'comm'
AND det_grp.date_geree = 'oui'
and det_grp.date_entree <= '$date' and det_grp.date_sortie >= '$date'
AND det_grp.TYPE_ELT = 'comm'
AND det_grp.CODE_GROUPE = groupes.CODE_GROUPE
AND sirene.INSEE = det_grp.CODE_ELT
AND sirene.DATE='fich'");
if (!$reqa epci )
{ die('Requête invalide : ' . mysql_error());
exit(); }
if ($reqaepci)
{ echo "OK REQ A EPCI";}
//$dataepci = mysql_fetch_array($reqaepci);
while ($dataepci = mysql_fetch_array($reqa epci ))
{
$reqbepci =mysql_query("update sirene.sirene set epci='$dataepci[CODE_GROUPE]' where $dataepci[id_unique]");
et ensuite je fais les mêmes requetes pour d'autres paramètres !!!
merci en tout cas de ta patience car moi je perds la mienne ....!!
fredo35m
Messages postés244Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention12 juillet 2006 2 sept. 2005 à 12:00
j'ai refait une tentative et ma base de données est bien mise à jours comme il faut mais par contre il reste toujours bloqué et est en ouverture de ma page finienrichir.php. et je pense que d'ici 1 h00 mysql va planter !!
je ne comprends vraiment pas pourquoi il fait bien les opérations dans ma table mais qu'il ne s'arrête pas !!
est-ce que cela peut venir de mes boucles while ???
PS: lorsque j'ai qu'une seule ligne à mettre à jours il fini bien le travail !!!!!