WD11 Question pour optimiser un traitement

Le
Roumégou Eric
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et
compilation dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé
externe. Donc pour toutes mes lignes, je fais une requête pour
recupérer cette id. Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour
chaque occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne
rechercher les Id (plus d'autres choses, mais ce sont les requetes qui
plombent!), 13 mn (Gasp !). Un peu mieux en passant de Innodb à MyISAM
mais tjrs trop long. En enlevant le trt des requetes, je passe à 19
secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de
faire "comme un select distinct" des valeurs d'une colonne pour ne pas
balancer 100 fois la requete de recup de l'id si c'est plusieurs fois
le mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide
?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable
en fn de n'importe quel fichier excel. Je ne cherche pas à automatiser
un trt bien particulier (ça je sais faire) mais à faire un outil
générique pas trop lent.

Merci de vos réponses.

--
Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Emmanuel LECOESTER
Le #18162671
solution préconisée:
chargement dans une table MySQL spécialement prévue à cet effet,
3 update pour affecter les id,
3 insert

c'est fini

"Roumégou Eric"
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et
compilation dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé externe.
Donc pour toutes mes lignes, je fais une requête pour recupérer cette id.
Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour chaque
occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne rechercher
les Id (plus d'autres choses, mais ce sont les requetes qui plombent!), 13
mn (Gasp !). Un peu mieux en passant de Innodb à MyISAM mais tjrs trop
long. En enlevant le trt des requetes, je passe à 19 secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de
faire "comme un select distinct" des valeurs d'une colonne pour ne pas
balancer 100 fois la requete de recup de l'id si c'est plusieurs fois le
mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide ?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable en
fn de n'importe quel fichier excel. Je ne cherche pas à automatiser un trt
bien particulier (ça je sais faire) mais à faire un outil générique pas
trop lent.

Merci de vos réponses.

--
Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)




Roumégou Eric
Le #18163541
Emmanuel LECOESTER a formulé la demande :
solution préconisée:
chargement dans une table MySQL spécialement prévue à cet effet,
3 update pour affecter les id,
3 insert



salut Manu
tu peux m'expliquer comme si j'avais 10ans ?
j'explique mieux mon besoin

ma table cible PEOPLE (bcp de champs) mais surtout

people.ppl_id l'id primaire
people.ppl_refext la clé externe
people.ppl_pere_1 en reflexive optionnel sur people.ppl_id
people.ppl_pere_2 en reflexive optionnel sur people.ppl_id
people.ppl_pere_3 en reflexive optionnel sur people.ppl_id

Un fichier Excel qui va contenir une zone clé externe que je vais
rapprocher de people.ppl_id pour récupérer l'id (si
ppl_refextÎttezone) ou en déduire que c'est une création.
Le fichier excel pourrait contenir des références à des pères. Si oui
je dois lire people de la meme façon et initier ppl_pere_1=le ppl_id
correspondant.

Donc au bout du premier traitement, dans une table mémoire la liste de
mes lignes excel lues avec les zones initialisées et le fait de savoir
si oui ou non je suis en création.

Après relecture de cette tablemémoire, j'ai un ordre insert en bulk qui
sera généré pour les créations, et plusieurs ordres update pour les
màj.

Pour info, voici la procédure de recup de l'id que j'envoie pour la clé
primaire et peut être pour les 1 à 3 pères.

PROCEDURE Rtv_PPL_IDparREFEXT(pLvl_id,pRef)
commande est une chaîne
lCurReq est un entier
chretour est un entier=0
commande="SELECT PPL_ID FROM PEOPLE WHERE LVL_ID="+pLvl_id+" AND
PPL_REFEXT="+Quote(pRef)
lCurReq=2
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)
RENVOYER chretour

sur people il y a un index LVL_ID,PPL_REFEXT





c'est fini

"Roumégou Eric"
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et
compilation dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé externe.
Donc pour toutes mes lignes, je fais une requête pour recupérer cette id.
Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour chaque
occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne rechercher
les Id (plus d'autres choses, mais ce sont les requetes qui plombent!), 13
mn (Gasp !). Un peu mieux en passant de Innodb à MyISAM mais tjrs trop
long. En enlevant le trt des requetes, je passe à 19 secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de
faire "comme un select distinct" des valeurs d'une colonne pour ne pas
balancer 100 fois la requete de recup de l'id si c'est plusieurs fois le
mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide ?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable en
fn de n'importe quel fichier excel. Je ne cherche pas à automatiser un trt
bien particulier (ça je sais faire) mais à faire un outil générique pas
trop lent.

Merci de vos réponses.

-- Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)







--
Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Daniel
Le #18163781
Roumégou Eric a écrit :
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et
compilation dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé
externe. Donc pour toutes mes lignes, je fais une requête pour recupérer
cette id. Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour chaque
occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne
rechercher les Id (plus d'autres choses, mais ce sont les requetes qui
plombent!), 13 mn (Gasp !). Un peu mieux en passant de Innodb à MyISAM
mais tjrs trop long. En enlevant le trt des requetes, je passe à 19
secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de
faire "comme un select distinct" des valeurs d'une colonne pour ne pas
balancer 100 fois la requete de recup de l'id si c'est plusieurs fois le
mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide ?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable
en fn de n'importe quel fichier excel. Je ne cherche pas à automatiser
un trt bien particulier (ça je sais faire) mais à faire un outil
générique pas trop lent.

Merci de vos réponses.





Solution essentiellement SQL :
tu intègres toutes tes données de ta feuille excel dans une table (pas
besoin d'index).

Ensuite en sql, tu "parses" toutes les données de ta table pour écrire
les données qui t'intéressent dans x tables. Sous innodb virer
l'autocommit et le faire dans une transaction. On peut améliorer la
vitesse en demandant de construire l'index à la fin.

Solution essentiellement Windev (ou autre langage):
tu lis ta feuille excel et tu parses directement dans un fichier texte
qui doit respecter le format des fichiers SQL de MySQL. Ensuite tu
importes ce fichier dans MySQL.

--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Firetox
Le #18163771
Bonjour,

oui comme le dit daniel
creation d'une table qui contient le fichier excel

apres avec un insert ..... (select .........)
tu peux inserer dans ta table une requete qui te donnera exactement ce que
tu veux avec une jointure sur la table créee pour le fichier excel
et c'est le plus simple et le plus rapide et c'est meme autmatisable avec un
create temporay dans le code depuis windev

Bon dev
@+

Firetox

"Daniel" 49490402$0$27351$
Roumégou Eric a écrit :
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et
compilation dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé
externe. Donc pour toutes mes lignes, je fais une requête pour recupérer
cette id. Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour chaque
occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne rechercher
les Id (plus d'autres choses, mais ce sont les requetes qui plombent!),
13 mn (Gasp !). Un peu mieux en passant de Innodb à MyISAM mais tjrs trop
long. En enlevant le trt des requetes, je passe à 19 secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de
faire "comme un select distinct" des valeurs d'une colonne pour ne pas
balancer 100 fois la requete de recup de l'id si c'est plusieurs fois le
mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide ?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable
en fn de n'importe quel fichier excel. Je ne cherche pas à automatiser un
trt bien particulier (ça je sais faire) mais à faire un outil générique
pas trop lent.

Merci de vos réponses.





Solution essentiellement SQL :
tu intègres toutes tes données de ta feuille excel dans une table (pas
besoin d'index).

Ensuite en sql, tu "parses" toutes les données de ta table pour écrire les
données qui t'intéressent dans x tables. Sous innodb virer l'autocommit et
le faire dans une transaction. On peut améliorer la vitesse en demandant
de construire l'index à la fin.

Solution essentiellement Windev (ou autre langage):
tu lis ta feuille excel et tu parses directement dans un fichier texte qui
doit respecter le format des fichiers SQL de MySQL. Ensuite tu importes ce
fichier dans MySQL.

--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)


patrice
Le #18163891
Salut

Comme le disent daniel et firetox, je confirme l'utilisation de la table
temporaire

Tu crée une table temporaire TMP contenant ton fichier excel (sans index
pour speeder les insert)
Tu ajoute un index sur ta référence externe.
Tu ajoute une colonne flag , défaut à 0
J'appelle TMP la table excel tempo, et FINAL ton beau fichier final.

Tu positionne flag=1 pour les TMP.ref_externe qui existe dans
FINAL.ref_externe
exemple oracle:
update TMP set FLAG=1 where (REF_EXTERNE) IN
( select REF_EXTERNE from FINAL)


Apres y'a pu qu'a ajouter les nouveaux :
insert into FINAL select * from TMP where FLAG=0

et updater les existants
update FINAL set ( liste_champ ) = (SELECT liste_champ from TMP where
tmp.ref_extern = final.ref_extern)

Bon c'est de l'oracle, mais doit y avoir son équivalent en sql standard.



"Roumégou Eric" news:
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et
compilation dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé
externe. Donc pour toutes mes lignes, je fais une requête pour
recupérer cette id. Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour
chaque occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne
rechercher les Id (plus d'autres choses, mais ce sont les requetes qui
plombent!), 13 mn (Gasp !). Un peu mieux en passant de Innodb à MyISAM
mais tjrs trop long. En enlevant le trt des requetes, je passe à 19
secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de
faire "comme un select distinct" des valeurs d'une colonne pour ne pas
balancer 100 fois la requete de recup de l'id si c'est plusieurs fois
le mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide
?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable
en fn de n'importe quel fichier excel. Je ne cherche pas à automatiser
un trt bien particulier (ça je sais faire) mais à faire un outil
générique pas trop lent.

Merci de vos réponses.

--
Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)




Roumégou Eric
Le #18164131
patrice avait énoncé :
update FINAL set ( liste_champ ) = (SELECT liste_champ from TMP where
tmp.ref_extern = final.ref_extern)



ça en mysql 4.20, je ne pense pas que cela soit possible.
???
on ne peut pas faire d'update sur la table en sélection.

--
Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
patrice
Le #18164291
Ca doit être un truc genre

update FINAL left join TMP on (FINAL.refx=TMP.refx) SET
FINAL.col1=TMP.col1, FINAL.col2=TMP.col2

"Roumégou Eric" news:
patrice avait énoncé :
> update FINAL set ( liste_champ ) = (SELECT liste_champ from TMP where
> tmp.ref_extern = final.ref_extern)

ça en mysql 4.20, je ne pense pas que cela soit possible.
???
on ne peut pas faire d'update sur la table en sélection.

--
Eric Roumégou
Webmaster des wtabletes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)




Roumégou Eric
Le #18166001
Roumégou Eric a émis l'idée suivante :
Bonjour,

je travaille sur un programme d'intégration de données paramétrables.
C'est à partir de fichier excel et cela doit alimenter ma base mysql.
je suis parti sur un truc bien chiadé avec génération du code et compilation
dynamique. Cela marche mais c'est trop lent.

Tout vient du fait que je dois récupérer un id à partir d'une clé externe.
Donc pour toutes mes lignes, je fais une requête pour recupérer cette id.
Soit 5000 lignes 5000 requetes (et l'index est ok).

Et compte tenu que je peux avoir 3 liaisons, je peux refaire pour chaque
occurrence 3 fois ce type de requetes.

Résultat : pour 5000 lignes et besoin d'aller 2 fois par ligne rechercher les
Id (plus d'autres choses, mais ce sont les requetes qui plombent!), 13 mn
(Gasp !). Un peu mieux en passant de Innodb à MyISAM mais tjrs trop long. En
enlevant le trt des requetes, je passe à 19 secondes.

Mes questions :
Je me demande si le fait d'appeler ces fn de requetes depuis la compil
dynamique ne fait pas mal (par rapport à une prog classique) ?
Y'a-t-il un moyen une fois les infos chargées dans une table mémoire de faire
"comme un select distinct" des valeurs d'une colonne pour ne pas balancer 100
fois la requete de recup de l'id si c'est plusieurs fois le mème ?
Aurais-je intérêt à charger cela dans une zone mémoire ? ou plus rapide ?

Bien sûr la difficulté de cela c'est que le traitement est paramétrable en fn
de n'importe quel fichier excel. Je ne cherche pas à automatiser un trt bien
particulier (ça je sais faire) mais à faire un outil générique pas trop lent.

Merci de vos réponses.



merci
je me suis inspiré de vos suggestions
en passant par une table de travail qui contient mes id, je génère la
création de cette table, l'alimentation, les jointures left, la
relecture de la requete, la màj de ma table mémoire etc ...

et mon traitement passe à 24 secondes.
oui c'est mieux ;-)

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Publicité
Poster une réponse
Anonyme