|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2005 Messages : 56 ![]() |
Salut tout le monde,
je suis en train de faire un import xml vers ma base de données (les balises du fichier xml ne correspondent pas au nom des champs des tables de ma BDD) mon import marche correctement, mais il est super long. je suppose que c'est du a la taille de mon fichier (600 000 lignes a peu pret) pour cette taille il met environ 5h me demandez pas de reduire le fichier, je sais que c'est enorme juste pour du texte, mais ce n'est malheureusement pas possible, le client n'y connais rien, et veut que ce soit rapide, enfin, pas trop long et a besoin de toutes les données dedans j'ai essayé pas mal de truc pour reduire le temps, mais quasiment rien a marché. par exemple, supprimer au maximum les variable temporaire. Code :
Code :
INSERT INTO ARCHIV_Valeur VALUES (var_ID_Valeur,var_ID_DFIDUI,lire_balise('Code_Valeur',element),lire_balise('Titre_Valeur',element),var_rang_valeur,lire_balise('Commentaire',element),NULL,''); mais lorsque je compile ca sous forms, il me met: Code :
sinon, existe t-il un moyen pour n'executer les requetes sql que a un certain moment ? par exemple, les stocker en memoire puis les faire s'executer, pour peut etre reduire les allez venu entre la bdd et le code (j'en sais rien, c'est juste une hypothese) j'avais pensé aussi a utiliser une sorte de for each pour parcourir la liste de node a la place du for. car si c'est stocké dans une liste chainée et que les elements 0,1,2,3.. ne sont pas trié correctement, il faut les rechercher, donc perte de temps Code :
derniere solution, mais assez galere, c'est d'essayer de le passer en SAX grace a java, mais je ne sais pas si on gagnerai beaucoup de temps, et ca n'a pas l'air tres facile. Si vous avez des idées, ou des corrections dans mon code, ou autre, ca serait hyper cool, moi j'suis a court d'idées je mets mon code en entier en fichier joint, enfin, la fonction qui me permet de parcourir le document et inserer dans ma bdd (Importer_Tables_Xml), et la fontion lire_balise qui retourne ce que contient une balise (en passant un domElement et un nom de balise) merci mike |
||||||
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2005 Messages : 56 ![]() |
merci pour ta reponse, je vais essayer de voir ca
si vous avez d'autres idées, n'hesitez pas |
|
|
00
|
|
|
#4 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2005 Messages : 56 ![]() |
j'ai lu les documents, mais ca ne m'a pas fait vraiment avancé.
le truc que j'aimerai bien tester, c'est supprimer mes variables intermediaires (v1,v2...). Code :
Code :
INSERT INTO ARCHIV_Valeur VALUES (var_ID_Valeur,var_ID_DFIDUI,lire_balise('Code_Valeur',element),lire_balise('Titre_Valeur',element),var_rang_valeur,lire_balise('Commentaire',element),NULL,''); mais lorsque je compile ca sous forms, il me met: Code :
si vous aviez un truc pour que ca marche, ca serait sympa mike |
||||
|
|
00
|
|
|
#5 | ||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Ce n’est pas en supprimant tes variables de travail que tu gagneras du temps mais dans la logique du traitement.
Exemple au lieu d’écrire une procédure qui fait Code :
Code :
|
||||
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2005 Messages : 56 ![]() |
merci mnitu
je sais que je ne gagnerai pas enormement en supprimant des variables, mais bon, c'etait une idée comme ca, car je n'en avais pas d'autres j'ai pas tout compris aux procedures piplined, mais tu penses que ca serait plus rapide ? si t'as d'autres idées, je suis preneur merci mike |
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Commençons doucement !
La première chose à faire este d’essayer de comprendre ou le temps passe (valable pour tout problème d’optimisation)! Pour cella il faut instrumentaliser un peu le code pour avoir cette information ou à la limite exécuter la procédure avec une trace sql. Ensuite, dans la ligne du plus petit effort, essayez pour l’instant d’utiliser les collections pour les boucles imbriquées. CAD : utilisez des collections pour accumuler les enregistrements avant de faire des bulks insert avec FOR ALL. .../... |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2005 Messages : 56 ![]() |
j'ai fait un trace, et analysé:
en gros, sur les 5h, il y a 1 minutes et quelques pour tous les insert 27 minutes sur les select et le reste en recuperant les temps avec sysdate (un sysdate avant des lire_balise, et un apres, puis on ajoute la difference a une autre variable) j'atteinds un peu plus de 4h donc c'est la recuperation des valeurs du XML qui prennent un maximum de temps les collections, c'est une sorte de tableau ou on stocke les données ? a moins que j'ai rien compris a la doc que je viens de lire ![]() mike |
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Bref le problème est dans la récupération des valeurs stockée dans le fichier XML. Le problème est que d’après ce que j’ai compris le parser PL/SQL est un DOM parser et cella signifie que il aura récréation en mémoire du fichier XML. Dans ton cas – pas de modification des informations contenues dans la structure XML cella coûte assez cher. Il semble qu’il est plus approprié d’utiliser un SAX parser dans ces conditions. Mais pour cela il faut changer de langage, utiliser java ou C.
Concernant les collections laisse tomber, tu gagneras seulement sur les quelques minutes d’insertion. PS. Pour mesurer le temps tu disposes d’une fonction dbms_utility.get_time. |
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2005 Messages : 56 ![]() |
hum...
bon ok, on va essayer de passer par java et sax et oui, le parser est un dom parser, il me semble que c'est le seul qui existe en pl/sql (on se demande pourquoi... ) merci beaucoup en tout cas je reviendrai par ici si j'ai des problemes avec le java |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com