|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Bonjour à tous,
J'ai créé un job job1 comme suit : tOracleInput_1 -----------> tMap_1 -------------> tOracleOutput_2 Le tOracleInput_1 se connecte à une table T1 d'une base B1 (via le contexte) et ramène des données avec une requête select simple (sans jointure) tOracleOutput_2 se connecte à une table T2 d'une base B2 (via le contexte) et y insère ce que le tOracleInput_1 a ramené comme lignes et ce via le tMap_1 simple (de colonne à colonne) Ce job prend énormément de temps (50 minutes parfois) alors qu'il traite au plus 2000 lignes J'ai créé un autre job similaire au premier mais qui se connecte à d'autres Tables, ce job ne prend qu'une seconde pourtant il traite le même nombre de lignes Avez-vous une idée pourquoi le premier prend du temps ? Je vous remercie |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
Bonjour,
Dans un premier temps je ferais le test de remplacer le tOracleOutput par un tFileOutputDelimited, afin d'identifier si le problème vient bien de l'insertion dans la base. Nicolas |
|
|
10
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Je te remercie.
On m'a parlé de tOracleOutputBulk mais comme je suis débutant je ne sais pas ce que c'est et c'est quoi la différence entre ce composant et le tOracleOutput |
|
|
00
|
|
|
#4 |
![]() ![]() Jean-Sébastien DARGESConsultant décisionnel Inscription : août 2008 Messages : 983 ![]() |
Pour moi le problème ne provient pas de Talend car 2000 lignes en 50 minutes.... mais plutôt d'une mauvaise configuration de tes tables Oracles ou/et des tablespaces. Vérifie la taille des block et des EXTENDS.
Vérifie quand même dans Talend à combien est positionné le Commit dans ton tOracleOutput
__________________
Google est ton ami mais ton voisin aussi Modérateur BI Mes tutoriels - FAQ Talend - FAQ SQL*Plus Suivez @Developpez sur twitter !
|
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Consultant en Business Intelligence Inscription : mai 2006 Messages : 275 ![]() |
J'imagine que ton tOracleInput_1 pointe sur une table qui contient pas mal de données et sélectionne celles qu'il veut par l'intermédiaire d'un WHERE <un champ>=[une valeur]
Il est probable que la table sur laquelle tu fais cette requête ne soit pas indexée (ou le soit mais mal). Essaie d'exécuter la requête SQL contenue dans ton tOracleInput_1 dans un client SQL et donnes nous le temps d'exécution et surtout le plan d'exécution. Nous pourrons t'indiquer si le problème vient bien de là et te donner quelques pistes pour y remédier. |
|
|
00
|
|
|
#6 |
![]() ![]() Jean-Sébastien DARGESConsultant décisionnel Inscription : août 2008 Messages : 983 ![]() |
Autre axe d'analyse : sur ta table cible : désactive les indexes et voit ce que ça fait
__________________
Google est ton ami mais ton voisin aussi Modérateur BI Mes tutoriels - FAQ Talend - FAQ SQL*Plus Suivez @Developpez sur twitter !
|
|
|
00
|
|
|
#7 | ||||
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Bonjour à tous,
je n'ai pas abandonné le sujet mais je n'ai pas vu vos réponses. En fait le job marchait en 2 minutes sur une base B1 mais 2h sur une base B2 Sachant qu'on a fait une restauration de la B2 à partir de B1, autrement B2 doit être une copie conforme de B1, je viens de regarder et certaines tables leurs manque un index que je retrouve dans B1 Exemple : --------- un tOracleOutput met à jour une table T1 (donc T1 est une table destination) Dans la B1, T1 avait un index Dans la B1, T2 n'a pas un index Pensez-vous que la lenteur vient de là ? Autre différence entre les 2 tables (destination) : Le code de l'ancienne table T1 (celle sur laquelle le job est rapide) contient à la fin ce code : Code :
Le code de la nouvelle table T1 (celle sur laquelle le job est lent) ne contient que ça à la fin ce code : Code :
Merci |
||||
|
|
00
|
|
|
#8 |
|
Membre éclairé
![]() Consultant en Business Intelligence Inscription : mai 2006 Messages : 275 ![]() |
Avant de recoder Oracle en cherchant dans des Tablespaces, montres nous les requêtes que tu fais et donnes nous la structure de tes tables (tu peux changer les noms des colonnes si cela pose un problème à tes patrons).
En informatique, comme partout d'ailleurs, pour régler un problème, il faut commencer par le plus simple puis aller vers le plus compliqué. Donc en premier, tu vérifies si c'est pas un problème de cable Ensuite tu attaques sur le SQL et la structure de ta base Et si tout cela ne suffit pas, tu pourras aller bidouiller les config' fines de ta base |
|
|
00
|
|
|
#9 |
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Ok,
voila le job en entier tOracleInput_1 -----------> tMap_1 -------------> tOracleOutput_2 tOracleInput_1 fait appel à un select sans jointure mais avec un where Code :
SELECT col1, col2, col3 FROM T1 WHERE col1 LIKE '%TICKET%'" tMap_1 est simple, c'est à dire : col1 ---> col1 col2 ---> col2 col3 ---> col3 T2 n'a pas d'index. Qu'est ce que je pourrais donner comme d'autres infos ? Merci |
|
|
00
|
|
|
#10 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
|
|
|
00
|
|
|
#11 |
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Justement je n'ai pas accès à tout.
Pour tout dire je fais transiter des données d'une base à une autre en passant par une base intermédiaire et le job est programmé par une chaine control-M pour qu'il se lance chaque 15 minutes donc je ne peux pas changer les destinations. Ce que j'ai fait c'est créer un autre job qui fait exactement la même chose et je l'ai testé sur une autre base de test, sur cette base le job prend 2 minutes donc je n'ai pas besoin de remplacer le tOracleOutput par un tFileOutputDelimited puisque c'est rapide. Merci |
|
|
00
|
|
|
#12 |
|
Membre éclairé
![]() Consultant en Business Intelligence Inscription : mai 2006 Messages : 275 ![]() |
Combien de lignes dans la table T1?
Combien de lignes avant traitement dans T2? Alimentation en annule et remplace ou en insertion? La colonne col1 de T1 est-elle indexée? (bien que je crois qu'un LIKE rende inutile l'index) As-tu un autre moyen d'identifier les lignes de type "TICKET" que via un LIKE? As-tu essayé d'exécuter la requête SELECT sur la base où tu as des problèmes pour voir combien de temps cela met? Peux-tu nous donner le plan d'exécution? |
|
|
00
|
|
|
#13 |
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Combien de lignes dans la table T1?
--> Cela dépend des heures, parfois le job doit ramener 3 lignes parfois 3000. Mais 3000 ne justifie pas un temps d'exécution de 2 h. Combien de lignes avant traitement dans T2? Alimentation en annule et remplace ou en insertion? --> Il ne doit pas y avoir de soucis pour le nombre de lignes puisque j'ai fait un log dans lequel j'ai pu récupérer le nombre de lignes que le tOracleInput_1 a lu et le nombre de lignes que le tOracleOutput_2 a traité et c'est toujours le même. tOracleOutput_2 fait un insert ou update. La colonne col1 de T1 est-elle indexée? (bien que je crois qu'un LIKE rende inutile l'index) --> le tOracleInput_1 prend plus qu'une colonne, 30 en tout mais j'ai simplifié par un col1. Aucune colonne n'est indexée As-tu un autre moyen d'identifier les lignes de type "TICKET" que via un LIKE? --> C'est une comparaison de chaine de caractère donc je peux mettre un ="TICKET" As-tu essayé d'exécuter la requête SELECT sur la base où tu as des problèmes pour voir combien de temps cela met? --> oui et la requête est rapide, je pense que c'est le tOracleOutput_2 qui prend du temps donc dans l'insert et update Peux-tu nous donner le plan d'exécution? --> Je n'ai pas compris la question. Juste une remarque : J'ai un client qui lance une requête assez compliquée, la requête prend 2 minutes sur l'ancienne version de la base sur laquelle on travailler, on a migré vers une 2eme base B2 et la requête prend 1h30. J'ai cherché s'il y a une différence entre B1 et B2, j'en ai trouvé plein grâce à Oracle SQL Developper notamment sur les index, je pense que l'origine de la lenteur vient de la config de la base B2 et non du job Merci |
|
|
00
|
|
|
#14 | ||||||
|
Membre éclairé
![]() Consultant en Business Intelligence Inscription : mai 2006 Messages : 275 ![]() |
Citation:
Si c'est effectivement quelques milliers de lignes au maximum, OK, le problème ne vient pas de là Citation:
Citation:
Citation:
Citation:
Citation:
Pour ceux qui ne savent pas ce qu'est un index, pour faire simple, c'est comme l'index d'un bouquin, un index donne, pour chaque "mot" la ou les pages où l'on doit le chercher, ce qui évite de devoir lire tout le bouquin pour retrouver la bonne phrase |
||||||
|
|
00
|
|
|
#15 | ||||||
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Citation:
Citation:
Citation:
Citation:
Citation:
Privilèges insuffisants Echec de l'accès à V$MYSTAT Obtenez le privilège de lecture du catalogue de votre administrateur de base de données: grant SELECT_CATALOG_ROLE to SWFDWHSA grant SELECT ANY DICTIONARY toSWFDHSA Citation:
Merci pour l'info, il est important que je pense aux index dans ma base |
||||||
|
|
00
|
|
|
#16 | |
|
Membre éclairé
![]() Consultant en Business Intelligence Inscription : mai 2006 Messages : 275 ![]() |
Citation:
336 000 lignes, c'est beaucoup pour un insert/update, il faut des index. La règle pour créer un index c'est de le faire sur la ou les colonnes qui ont le plus de "sens" pour tes requêtes. L'idéal c'est d'indexer le ou les champs qui servent à identifier une ligne parmi toutes. Si tu as un identifiant unique par ligne, c'est lui qu'il faut indexer, si ce n'est pas le cas, il faut indexer le groupe de colonnes qui te permettent de d'identifier tes lignes. Exemple simplifié volontairement : Dans une table Clients, avec un identifiant unique du client, c'est cet identifiant qu'il faut indexer. Dans une table Produits, avec un identifiant unique du produit, c'est cet identifiant qu'il faut indexer. Dans une table Ventes avec l'identifiant du client et l'identifiant du produit mais pas d'identifiant de ta vente, tu dois indexer les deux identifiants. |
|
|
|
00
|
|
|
#17 | ||
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Je dois appliquer l'index sur la table source ou destination ?
Quand tu dis qu'il faut appliquer un index sur les colonnes qui ont un sens pour la requête pour mon exemple cela voudrait dire que je dois indexer toutes les colonnes (50 au total). voilà la requête select dans le tOracleInput Code :
|
||
|
|
00
|
|
|
#18 | ||
|
Membre éclairé
![]() Consultant en Business Intelligence Inscription : mai 2006 Messages : 275 ![]() |
Dans l'idéal, tu dois indexer les deux tables.
Ta table source doit être indexée sur le champ RECORDTYPE. Par contre, ton WHERE n'est pas adapté à l'utilisation d'un index, il faut l'écrire plutôt de la façon suivante : Code :
WHERE RECORDTYPE IN ('TICKET','ISSUE','ticket','issue') Code :
SELECT DISTINCT RECORDTYPE FROM SAS_CALISSUE_TER; Si c'est bien le champ ID, en l'indexant cela devrait fonctionner mieux. Un conseil après création d'index, passer les statistiques sur les tables indexées : Code :
|
||
|
|
00
|
|
|
#19 | ||
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Ok je tiens en compte de tout cela.
Juste une dernière remarque : la table destination n'a pas d'identifiant (il n'y a pas de clé et toutes les colonnes sont nullables). Je ne pense pas pouvoir modifier la table destination, c'est la prod et je m'estime heureux qu'on m'autorise à y accéder. voici le code SQL de la table destination Code :
|
||
|
|
00
|
|
|
#20 |
|
Membre à l'essai
![]() Inscription : janvier 2009 Messages : 159 ![]() |
Bonjour à tous,
Quand j'ai créé ce sujet je ne pensais jamais un jour cliquer sur "résolu". Mon job prend 30 secondes aujourd'hui contre 3h avant le week end. Pour ceux qui tombent sur le même cas que moi j'ai ajouté des index sur les tables volumineuses. Merci à tous ceux qui m'ont aidé Bonne journée à tous |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com