traiter avec de grosses base de données

traiter avec de grosses base de données - PHP - Programmation

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  :(  
 

Reply

Marsh Posté le 25-09-2003 à 18:49:05   

Reply

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? :D
 
Je vote pour une boucle infinie? :o


Message édité par Freekill le 25-09-2003 à 18:53:38

---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

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… :D
 
Je vote pour une boucle infinie… :o


 
meme si cette base est une base distante?
elle est sur un autre serveur


Message édité par saxgard le 25-09-2003 à 18:54:11
Reply

Marsh Posté le 25-09-2003 à 18:56:06    

Saxgard a écrit :


 
meme si cette base est une base distante?
elle est sur un autre serveur


 
A moins que le serveur soit un 486 DX avec modem 14.4kbps qui lagge à mort? :D


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

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?
 :(

Reply

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.


Message édité par saxgard le 25-09-2003 à 19:00:28
Reply

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 ?


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

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

Reply

Marsh Posté le 25-09-2003 à 19:06:32    

Saxgard a écrit :


 
non juste la connection ca va tres vite  


 
Et juste le select sans le reste ?


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

Marsh Posté le 25-09-2003 à 19:08:35    

Freekill a écrit :


 
Et juste le select sans le reste ?


 
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

Reply

Marsh Posté le 25-09-2003 à 19:08:35   

Reply

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


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

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?

Reply

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 [:proy] )

Reply

Marsh Posté le 26-09-2003 à 08:43:47    

mrBebert a écrit :

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 [:proy] )


 
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.


Message édité par saxgard le 26-09-2003 à 09:02:33
Reply

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 :/

Reply

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.
 :??:

Reply

Marsh Posté le 26-09-2003 à 12:33:44    

C'est quoi cette table avec 140 colones


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

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? [:grinking]


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

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 :
  1. select * from PRO where CODSOC='1';


 
fais un

Code :
  1. select justeunchamp from PRO where CODSOC='1';


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

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? :D
 
( Dans les autres cas aussi en fait mais bon? :p )


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

Marsh Posté le 26-09-2003 à 13:23:31    

Freekill a écrit :


 
Le résultat d'une réflexion particulièrement poussée sur l'optimisation à mon avis… [:grinking]


 
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  :(

Reply

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  :??: ....
 
et en plus plutot que de faire un :

Code :
  1. select * from PRO where CODSOC='1';


 
fais un

Code :
  1. select justeunchamp from PRO where CODSOC='1';




 
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

Reply

Marsh Posté le 26-09-2003 à 13:25:06    

Saxgard 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  :(  


 
Je me demande quand même comment ils ont pu en arriver à utiliser 140 champs?


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

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  :??: ....
 
et en plus plutot que de faire un :

Code :
  1. select * from PRO where CODSOC='1';


 
fais un

Code :
  1. select justeunchamp from PRO where CODSOC='1';




 
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  :(

Reply

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 :
  1. if(!odbc_fetch_row($result2,1 ))

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 :pt1cable:


Message édité par Mara's dad le 26-09-2003 à 13:33:25

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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.
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 :
  1. if(!odbc_fetch_row($result2,1 ))

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 :pt1cable:


 
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)


Message édité par saxgard le 26-09-2003 à 13:40:03
Reply

Marsh Posté le 26-09-2003 à 13:42:20    

Saxgard a écrit :


 
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  :(  


 
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


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

Marsh Posté le 26-09-2003 à 13:42:50    

Saxgard a écrit :


 
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)


 
Je pige pas l'utilité de la partie en rouge?


Message édité par Freekill le 26-09-2003 à 13:43:14

---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

Marsh Posté le 26-09-2003 à 13:44:40    

Lord II 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


 
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?


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

Marsh Posté le 26-09-2003 à 13:45:00    

Lord II 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


 
oauis ca j'ai remarqué mais il ya qu'en mettant cette condition que ca marche , je n'y comprend plus rien

Reply

Marsh Posté le 26-09-2003 à 13:46:15    

Freekill 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?


 
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 )


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

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 :fou:
 
Fait un effort, ou arrête de nous faire perdre notre temps, merçi.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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 :
  1. $resulttemp=odbc_exec($connODBC,"select CODPRO from PRO where CODSOC='1'" );
  2. while(odbc_fetch_row($resulttemp))
  3. {
  4.     $rc = odbc_result($resulttemp,"CODPRO" );
  5.     //echo $rc;
  6.     mysql_query("insert into t_codprotemp(CODPRO)                  values ('$rc')" );
  7. }


 
A mon humble avis ce petit bout de code devrait suffir


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

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,
 

Code :
  1. $resulttemp=odbc_exec($connODBC,"select CODPRO from PRO where CODSOC='1'" );
  2. while(odbc_fetch_row($resulttemp))
  3. {
  4.     $rc = odbc_result($resulttemp,"CODPRO" );
  5.     //echo $rc;
  6.     mysql_query("insert into t_codprotemp(CODPRO)                  values ('$rc')" );
  7. }


 
A mon humble avis ce petit bout de code devrait suffir


 
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

Reply

Marsh Posté le 26-09-2003 à 13:59:37    

Je vote TROLL :fou:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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" );


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

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  désolé mara's dad

Reply

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
 
Pour voir ou ca coince utilise echo date( "i s" );


 
merci  je vais voir ac de suite

Reply

Marsh Posté le 26-09-2003 à 14:08:10    

Lord II 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 )


 
ooops, j'avais oublié de le remettre après ma dernière mise à jour php? :D  :sweat:


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed