Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/07/2006, 11h06   #1
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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 :
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");
 
}
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 11h36   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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 :
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 14h12   #3
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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.
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 09h24   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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 !
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 09h31   #5
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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!
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 11h46   #6
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 12h10   #7
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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 ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 08h22   #8
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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)???
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 10h06   #9
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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???
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 10h37   #10
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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?
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 11h37   #11
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
Code :
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...
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 12h41   #12
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
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 126
Points : 2 602
Points : 2 602
la balise code c'est en cliquant sur #, mais en mettant #...
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 10h40   #13
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
dsl, qqun peut-il me répondre svp...
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 15h53   #14
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 10h25   #15
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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 :
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...
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 10h33   #16
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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 :
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.
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2006, 09h17   #17
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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...
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2006, 09h37   #18
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2006, 09h55   #19
Membre habitué
 
Avatar de johnkro
 
Étudiant
Inscription : juin 2006
Messages : 276
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2006
Messages : 276
Points : 146
Points : 146
Envoyer un message via MSN à johnkro
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...
johnkro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2006, 10h07   #20
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h25.


 
 
 
 
Partenaires

Hébergement Web