|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Bonjour,
Je travaille sous Talend version 4.1.2 avec une base de données Oracle 11g. J'ai lancé mon application hier à 15h30 et en revenant ce matin à 9h30 j'ai trouvé un message d'erreur sur mon écran. Après avoir chargé les paramètres du contexte, il s'affiche : Code :
error.png Cette requête est censée récupérer plus d'un million de lignes... Comment je peux éviter ce problème? Merci. |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Benoit DurandConsultant en Business Intelligence Freelance Inscription : mars 2005 Messages : 812 ![]() |
Visiblement Oracle a coupé la connexion.
C'est le serveur Oracle qui rame autant ? 1 million de lignes ce n'est pas la mer à boire non plus. On pourrait avoir accès à la requête ?. Pour les fortes volumétries j'ai tendance à déplacer la charge de travail au maximum sur le serveur SQL qui est fait pour ça (comme le tUniq). cdt,
__________________
Pensez à la fonction Recherche |
|
|
00
|
|
|
#3 | ||
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Bonjour,
Merci de votre réponse. Voici ma requête : Code :
P.S j'ai oublié de le préciser, mais lors de l'éxecution de mon job Talend, le débit du nombre de lignes par secondes ne fait que baisser tout au long de mon exécution. Cette nuit je n'ai pas pu observer la valeur minimale atteinte, mais je pense que le débit baisse en continue progressivement, jusqu'à atteindre 0... Lorsque vous dites "déplacer la charge de travail sur le serveur SQL", comment puis-je procéder pour faire ça? Si mes bases client sont sur des server Oracle c'est quand même faisable? Sans installer de server SQL sur leur poste? |
||
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Benoit DurandConsultant en Business Intelligence Freelance Inscription : mars 2005 Messages : 812 ![]() |
Citation:
Concernant le sql, il faudrait vérifier que le plan d'exécution est optimisé et notamment que les index sont bien utilisés. Pour le tUniqRow il doit être remplaçable dans le sql par un distinct ou group by ou row_number. Ou au mieux bien vérifier que le stockage sur disque est activé. A voir s'il n'y a pas d'autres amélioration à faire avec les autres composants.
__________________
Pensez à la fonction Recherche |
|
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
En reliant mon tInput à un tJavaRow qui ne fait rien, après un petit moment de 'starting' il part à 2300 row/s et le débit augmente (jusqu'à 5300)! J'ai donc un problème d'étouffement à la suite de ma requête du aux multiples étapes de mon traitement...
Avec cette configuration, ma requête s'exécute en 9 minutes. On est loin de toute la nuit comme précédemment, sans aboutissement d'ailleurs! |
|
|
00
|
|
|
#6 | |||
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Citation:
Citation:
Un simple distinct au début de ma requête me donne l'erreur suivante : Exception in component tOracleInput_1 java.sql.SQLSyntaxErrorException: ORA-01791: cette expression n'a pas été SELECTionnée at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413) at oracle.jdbc.driver.T4C at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:183) at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:780) at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:855) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186) at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1377) at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:387) at projet_cleva.testjob_0_1.testJob.tOracleInput_1Process(testJob.java:2960) at projet_cleva.testjob_0_1.testJob.tOracleConnection_1Process(testJob.java:615) at projet_cleva.testjob_0_1.testJob.tPostjob_1Process(testJob.java:498) at projet_cleva.testjob_0_1.testJob.runJobInTOS(testJob.java:5809) at projet_cleva.testjob_0_1.testJob.main(testJob.java:5625) Je ne vois pas comment le supprimer en modifiant ma requête autrement qu'avec un distinct... Citation:
|
|||
|
|
00
|
|
|
#7 | ||
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
J'ai suivi votre conseil, et utilisé un Group By. Ma requête est donc ainsi :
Code SQL :
Et j'ai pu enlever le tUniqRow (Remove Copy) |
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Benoit DurandConsultant en Business Intelligence Freelance Inscription : mars 2005 Messages : 812 ![]() |
et il y a du mieux ?
Si la requête ne dure que 9min on peut oublier l'optimisation par index le problème ne doit pas venir de là.
__________________
Pensez à la fonction Recherche |
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
En ne laissant que certains composants, j'obtiens les temps d’exécution et débit maximum suivant :
tInput => tMap : 9 min, 3547.19 row/s tInput => tMap => tFilter : 8 min, 4096.99 row/s tInput => tMap => tFilter => tPivotToColumns : stoppé à 12 minutes, < 90 row/s |
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
J'ai re-modélisé mon application, j'ai ainsi pu trouver le composant qui pose problème... C'est le tPivot!
test.jpg Seulement, je ne peux pas me passer de ce composant... Une solution pour éviter ce goulot d'étranglement? |
|
|
00
|
|
|
#11 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
Bonjour,
Le facteur limitant sur l'exécution du tPivot doit être le cpu. Si la machine sur laquelle tu fais tourner le traitement a plusieurs cpu, peut-être pourrais-tu découper ton fichier temporaire en plusieurs fichier, et traiter chaque fichier en parallèle ? Sinon une autre piste serait de revoir si l'utilisation du tPivot est vraiment nécessaire, et si tu ne peux pas utiliser d'autres composants qui utilisent moins de ressources. (genre un tMap avec plusieurs flux de sortie, ou un tNormalize suivi d'un tMap (mais je ne suis pas certain que ce soit moins couteux)). Nicolas |
|
|
00
|
|
|
#12 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Je ne peux pas découper le fichier temporaire et effectuer les traitements séparément pour deux raisons :
- le script sera effectué sur des machines clients dont je ne connais pas les caractéristiques... - le transfert des lignes en colonne dépend des lignes précédemment switchées... Exemple : Row en entrée de mon tPivot : "Numéro police" "Date souscription" "Type Garantie" "Prime garantie" "1" "23/11/2010" "Tout risques" "500" "1" "23/11/2010" "Bris de glace" "100" "2" "22/08/2009" "Dommages" "300" "2" "22/08/2009" "Bris de glace" "200" "3" "10/03/2009" "Dommages" "100" "4" "05/04/2009" "Catastrophes" "50" "4" "05/04/2009" "Tout risques" "20" "4" "05/04/2009" "Dommages" "80" Row en sortie de mon tPivot : "Numéro police" "Date souscription" "Tout risques" "Bris de glace" "Dommages" "Catastrophes" "1" "23/11/2010" "500" "100" "2" "22/08/2009" "" "200" "300" "3" "10/03/2009" "" "" "100" "4" "05/04/2009" "20" "" "80" "50" Ainsi je ne peux pas dissocier les traitements de chaque ligne, imaginons que je split mes row en entrée en deux fichiers : Fichier 1 : "Numéro police" "Date souscription" "Type Garantie" "Prime garantie" "1" "23/11/2010" "Tout risques" "500" "1" "23/11/2010" "Bris de glace" "100" "2" "22/08/2009" "Dommages" "300" "2" "22/08/2009" "Bris de glace" "200" Fichier 2 : "Numéro police" "Date souscription" "Type Garantie" "Prime garantie" "3" "10/03/2009" "Dommages" "100" "4" "05/04/2009" "Catastrophes" "50" "4" "05/04/2009" "Tout risques" "20" "4" "05/04/2009" "Dommages" "80" J'obtiendrai en sortie : Première sortie : "Numéro police" "Date souscription" "Tout risques" "Bris de glace" "Dommages" "1" "23/11/2010" "500" "100" "2" "22/08/2009" "" "200" "300" Deuxième sortie : "Numéro police" "Date souscription" "Tout risques" "Dommages" "Catastrophes" "3" "10/03/2009" "" "100" "4" "05/04/2009" "20" "80" "50" Je n'ai donc pas les même intitulés de colonnes... |
|
|
00
|
|
|
#13 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Je ne pense pas que mon tPivot puisse être remplacé par un autre composant. Maintenant que j'ai expliqué le traitement qu'il me permettait de faire, si vous pensez que c'est possible dites-le moi
Merci! |
|
|
00
|
|
|
#14 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
Ok, je vois...
Est-ce que les différents types de garanties que tu peux avoir sont fixés ou est-ce qu'ils peuvent évoluer ? |
|
|
00
|
|
|
#15 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Ils ne sont pas fixes du tout, la est tout le problème, je ne peux pas pré-nommer les entêtes des champs de mon fichier... Le nombre et le nom des garanties est complètement variable...
|
|
|
00
|
|
|
#16 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
Ok, je pense que le tPivotToColumnsDelimited est un peu surdimensionné pour faire ce que tu souhaites (tu n'as pas besoin de sa fonctionnalité d'agrégation par exemple), du coup il utilise plus de ressources que nécessaire.
D'un autre coté, je ne vois pas comment faire ce que tu souhaites sans utiliser ce tPivot... Peut-être que quelqu'un d'autre aurait une idée ? |
|
|
00
|
|
|
#17 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Oui, j'ai essayé aussi de trouver une autre solution que ce tPivot, mais c'est la seule que j'ai obtenue pour l'instant... Donc je me vois mal m'en passer maintenant! ^^.
Oui quelqu'un, help please |
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Benoit DurandConsultant en Business Intelligence Freelance Inscription : mars 2005 Messages : 812 ![]() |
Vous utilisez bien du sql server ?
J'ai trouvé ça sur internet : http://fadace.developpez.com/mssql/pivot/ http://msdn.microsoft.com/fr-fr/library/ms177410.aspx A fouiller. SQl server sera peut être le plus puissant que Talend sur ce coup là. IL faudra peut être charger les données dans une table temporaire m=pour faire les manipulations.
__________________
Pensez à la fonction Recherche |
|
|
00
|
|
|
#19 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Bonjour Benoit.
Non, toutes mes tables client sont sur une base Oracle 11g... |
|
|
00
|
|
|
#20 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com