traiter avec de grosses base de données - PHP - Programmation
Marsh Posté le 25-09-2003 à 18:53:18
Plus de 30 secondes pour sélectionner un enregistrement dans une petite table avec seulement 200.000 entrées ça me parait impossible?
Je vote pour une boucle infinie?
Marsh Posté le 25-09-2003 à 18:53:51
Freekill a écrit : Plus de 30 secondes pour sélectionner un enregistrement dans une petite table avec seulement 200.000 entrées ça me parait impossible… |
meme si cette base est une base distante?
elle est sur un autre serveur
Marsh Posté le 25-09-2003 à 18:56:06
Saxgard a écrit : |
A moins que le serveur soit un 486 DX avec modem 14.4kbps qui lagge à mort?
Marsh Posté le 25-09-2003 à 18:56:30
$result2=odbc_exec($connODBC,"select * from PRO where CODSOC='1'" );
if(!odbc_fetch_row($result2,1 ))
{
$rc = odbc_result($result2,"CODPRO" );
$result=mysql_query("insert into t_cod_protemp(CODPRO)
values ($rc)" );
while(odbc_fetch_row($result2))
{
$rc = odbc_result($result2,"CODPRO" );
$result=mysql_query("insert into t_codprotemp(CODPRO)
values ('$rc')" );
}
}
tu voix une boucle infini la?
Marsh Posté le 25-09-2003 à 18:59:36
j'ai mis :
$result2=odbc_exec($connODBC,"select CODPRO from PRO where CODSOC='1'" );
if(!odbc_fetch_row($result2,1 ))
{
$rc = odbc_result($result2,"CODPRO" ); // ICI LE CHANGEMENT
//echo $rc ."<br>";
$result=mysql_query("insert into t_cod_protemp(CODPRO)
values ($rc)" );
while(odbc_fetch_row($result2))
{
$rc = odbc_result($result2,"CODPRO" );
$result=mysql_query("insert into t_codprotemp(CODPRO)
values ('$rc')" );
}
}
et ca a l'air d'aller un peu meiux , plus le message des 30s mais ca rame encore un peu.
Marsh Posté le 25-09-2003 à 19:00:37
Et si tu essaie juste de te connecter à la BDD sans faire de requête, ça fait un timeout aussi ?
Marsh Posté le 25-09-2003 à 19:02:03
Freekill a écrit : Et si tu essaie juste de te connecter à la BDD sans faire de requête, ça fait un timeout aussi ? |
non juste la connection ca va tres vite
Marsh Posté le 25-09-2003 à 19:06:32
Saxgard a écrit : |
Et juste le select sans le reste ?
Marsh Posté le 25-09-2003 à 19:08:35
Freekill a écrit : |
tu veux ditre que je ne fais pas le insert?
bah faudra que j'essaye
si vous avez d'autres suggestion , la je dois rentrer , j'en peu plus du boulot je uis naze ;o)
merci d'avance
Marsh Posté le 25-09-2003 à 20:50:22
Une petite question en passant, pourquoi utilise tu le pilote ODBC, ne pourrais tu pas utiliser le pilote oracle natif de php
Marsh Posté le 25-09-2003 à 22:06:22
Lord II a écrit : Une petite question en passant, pourquoi utilise tu le pilote ODBC, ne pourrais tu pas utiliser le pilote oracle natif de php |
euh bin j'y est pas pensé je connaissai pas , mais comment ca marche? faut-il installé quelquechose? faut-il l'installé ce pilote? et en php il y auarit des fonctions pour attaquer la base en suite?
Marsh Posté le 25-09-2003 à 22:34:36
Y a tout ici
http://fr.php.net/manual/en/ref.oracle.php
Sinon, si tu cherches juste l'existence d'une valeur, fais plutot un :
SELECT COUNT(*) FROM ...
(pas la peine de retourner les lignes si tu ne t'en sert pas ensuite, les compter suffit )
Marsh Posté le 26-09-2003 à 08:43:47
mrBebert a écrit : Y a tout ici |
ok je vais regarder ca
non mais en fait la je les selectione et les mets dans une base local mysql pour eviter de travailler sur la base distante parceque je boucle 20 fois sur la requete et ca rame.
Marsh Posté le 26-09-2003 à 09:03:18
bon je suis allé voir mais le pb c'ets qu'il faut isntaller l'extension, et pour ca je suis pas tres doué , d'autant plus que j'utilise easyphp
Marsh Posté le 26-09-2003 à 12:02:34
es ce que c pb ou ca rame peuvent etre lié non pas au nombre d'enregistrement mais sutt au nombre de colonnes dans la table , car il ya : 140 colonnes dc 140 colonnes * 224 000 enregistrement.
Marsh Posté le 26-09-2003 à 12:33:44
C'est quoi cette table avec 140 colones
Marsh Posté le 26-09-2003 à 12:39:12
Lord II a écrit : C'est quoi cette table avec 140 colones |
Le résultat d'une réflexion particulièrement poussée sur l'optimisation à mon avis?
Marsh Posté le 26-09-2003 à 12:43:23
ca semble bizarre ton problème mais comme dit plus haut .. c'est pas judicieux de passer par ODBC ....
et en plus plutot que de faire un :
Code :
|
fais un
Code :
|
Marsh Posté le 26-09-2003 à 13:11:14
Oui, c'est sûr que s'il y a 140 champs (cent-quarante!), il vaut mieux n'en sélectionner qu'un?
( Dans les autres cas aussi en fait mais bon? )
Marsh Posté le 26-09-2003 à 13:23:31
Freekill a écrit : |
bah moi j'y suis pour rien c'ets une table oracle pour un ERP
je suis arrivé dans la boite c'était comme ca , mnt je doit subir
Marsh Posté le 26-09-2003 à 13:24:14
simogeo a écrit : ca semble bizarre ton problème mais comme dit plus haut .. c'est pas judicieux de passer par ODBC ....
|
oauis je l'ai fait ca marche mieux , mais ca n'empeche que cette table risuqe de causer pas mal de pb a l'avenir
Marsh Posté le 26-09-2003 à 13:25:06
Saxgard a écrit : |
Je me demande quand même comment ils ont pu en arriver à utiliser 140 champs?
Marsh Posté le 26-09-2003 à 13:25:35
simogeo a écrit : ca semble bizarre ton problème mais comme dit plus haut .. c'est pas judicieux de passer par ODBC ....
|
bin le pb c'ets que je ne sais pas vraiment comment faire s'en passer par ODBC , l'extension oracle , je ne sais aps vraiment l'installer , et le pb c'ets que le projet que je doit faire doit etre fini tres rapidement
Marsh Posté le 26-09-2003 à 13:31:43
Dans ton premier post, tu parles d'un where sur le champ CODPRO dans une table PRODUIT.
Je supose donc, vu les noms, que CODPROD est la cléf primaire et que çà devrait être super rapide.
Mais dans ton exemple de code, tu fais un where sur CODSOC, et je me pose donc la question : y-a-t-il un index sur CODSOC ?
Ensuite, tu fais :
Code :
|
Qui conditionne tout le reste. Si je comprend bien odbc_fetch_row(), tu ne fait rien (le !) si tu arrive à lire la première ligne, et si tu n'y arrive pas (?) tu enregistre la première ligne dans une table et puis tu boucles
Ensuite, y'a un premier insert dans t_cod_protemp où CODPRO est un nombre puis les autres (ceux de la boucle) dans la table
t_codprotemp où CODPRO est une chaîne.
Bon, mais c'est peut-être moi qu'ai pas capté un truc
Marsh Posté le 26-09-2003 à 13:39:04
Mara's dad a écrit : Dans ton premier post, tu parles d'un where sur le champ CODPRO dans une table PRODUIT.
Qui conditionne tout le reste. Si je comprend bien odbc_fetch_row(), tu ne fait rien (le !) si tu arrive à lire la première ligne, et si tu n'y arrive pas (?) tu enregistre la première ligne dans une table et puis tu boucles |
bon voila je désire enregistrer tous les CODPRO de la table oracle (celle des 140 colonnes) dans une table MySQL avce une seule colone "CODPRO"
la condition c'est que le CODSOC du produit ='1'
résultat j'ai fait ca:
$resulttemp=odbc_exec($connODBC,"select CODPRO from PRO where CODSOC='1'" );
if(!odbc_fetch_row($resulttemp,1 ))
{
$rc = odbc_result($resulttemp,"CODPRO" );
echo $rc;
$result=mysql_query("insert into t_cod_protemp(CODPRO)
values ('$rc')" );
while(odbc_fetch_row($resulttemp))
{
$rc = odbc_result($resulttemp,"CODPRO" );
echo $rc;
$result=mysql_query("insert into t_codprotemp(CODPRO)
values ('$rc')" );
}
}
et ca rame
surement que je doit merder mais je ne sais pas ou.
je suis rester plus d'un an sans trop developpé et j'ai perdu un peu ;o)
Marsh Posté le 26-09-2003 à 13:42:20
Saxgard a écrit : |
Pour activer oracle, il suffit d'enlever le point virgule devant la ligne :
Citation : ;extension=php_oracle.dll |
Ensuite on relance le serveur web, et on modifie les pages pour utiliser les fonctions oracle plutôt que odbc, pour cela vive le manuel : http://fr3.php.net/manual/en/ref.oracle.php
Ensuite comme le fait remarquer Mara's dad, il semble que la structure du programme après l'éxécution de la requète soit un bizarre car odbc_fetch_row renvoie true s'il y a un résultat (http://fr3.php.net/manual/en/funct [...] ch-row.php), donc tu ne rentres dans la boucle que quand il n'y a pas de résultats, il me semble
Marsh Posté le 26-09-2003 à 13:42:50
Saxgard a écrit : |
Je pige pas l'utilité de la partie en rouge?
Marsh Posté le 26-09-2003 à 13:44:40
Lord II a écrit :
|
Ca me fait une erreur "missing dll" quand j'enlève juste le point-virgule.
A mon avis y'a des trucs à télécharger et/ou configurer en plus?
Marsh Posté le 26-09-2003 à 13:45:00
Lord II a écrit :
|
oauis ca j'ai remarqué mais il ya qu'en mettant cette condition que ca marche , je n'y comprend plus rien
Marsh Posté le 26-09-2003 à 13:46:15
Freekill a écrit : |
Il faut penser à renseigner le paramètre extension_dir aus alentours de la ligne 420. Il faut lui indiquer le chemin du repertoire contenant les fameuses extensions. ( typiquement, c:\php\extension )
Marsh Posté le 26-09-2003 à 13:47:54
Je suis pas le seul à trouver ce bout de code mystérieux !
Saxgard, on a regardé ton code, posé des questions précise sur l'utilité de certaines partie, demandé des explications sur pourquoi tel champs, telle table...
Et tu te contente de reposer ta question
Fait un effort, ou arrête de nous faire perdre notre temps, merçi.
Marsh Posté le 26-09-2003 à 13:52:12
Bon allez, je veux bien faire un effort et tu va me dire ce que ca donne,
Code :
|
A mon humble avis ce petit bout de code devrait suffir
Marsh Posté le 26-09-2003 à 13:54:49
Lord II a écrit : Bon allez, je veux bien faire un effort et tu va me dire ce que ca donne,
|
je viens juste d'essayer et ca rame encore pff j'y vcomprend plus rien
Mara's dad , je sais se suis désolé si je repose ma question mais j'ai toujours peur d ene pas etre assez clair , mais sinon je vous remercie de l'aide que vous essayez de m'apporter
Marsh Posté le 26-09-2003 à 13:59:37
Je vote TROLL
Marsh Posté le 26-09-2003 à 14:00:31
A mon avis, il faut que tu actives oracle et que tu passes par les fonctions oracle car cela devrait te faire gagner un peu de temps
Pour voir ou ca coince utilise echo date( "i s" );
Marsh Posté le 26-09-2003 à 14:00:47
bon je vais essayer avce l'extension oracle , la fonction ora_logon a l'air de passer
je vous remercie désolé mara's dad
Marsh Posté le 26-09-2003 à 14:01:14
Lord II a écrit : A mon avis, il faut que tu actives oracle et que tu passes par les fonctions oracle car cela devrait te faire gagner un peu de temps |
merci je vais voir ac de suite
Marsh Posté le 26-09-2003 à 14:08:10
Lord II a écrit : |
ooops, j'avais oublié de le remettre après ma dernière mise à jour php?
Marsh Posté le 26-09-2003 à 14:10:00
pff je craque ca me marque :
Warning: Oracle: Connection Failed: ORA-01034: ORACLE not available in c:\program ..
$result=ora_logon ( "user" , "pass" ) ;
if (!$result)
return false;
return $result;
et ca n'a pas l'air de passer
il n'y a rien d'autrea faire que de toucher le php.ini?
il devrait reconnaitre la base Oracle distante tt seul?
je suis larguer
Marsh Posté le 25-09-2003 à 18:49:05
Voila
j'ai besoin de tester si une valeur se trouve deja dans une base de données "oracle"
la table qui pourrait contenir cette valuer contient plus de 200 000 valeurs
et le pb c'ets que ca met trop d etemps a faire un
"select codpro from produit where codpro='$val'";
d'autant plus queje doit effectuer cette operation 20 fois
avait vous une idée?
comme traiter de grosse base de données comme pour les forums?
j'ai le message suivant :
Fatal error: Maximum execution time of 30 seconds exceeded in c:\...
merci d'avance