|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Inscription : juillet 2007 Messages : 108 ![]() |
Bonjour à tous,
Deux des scripts de l'ETL sur lequel je travaille chargent environ 18 millions de lignes chacun. Bien que le nombre de lignes et le nombre de colonnes soit relativement semblables, les performances sont grandement différentes: Script 1: 18601974 rows created. Elapsed: 01:17:05.21 Script 2: 18669334 rows created. Elapsed: 00:02:21.37 Les deux scripts sont des "insert into (...) select (...) from", réalisés avec les hints append et parallel. Jusqu'ici la situation est assez similaire. Dans le script 1, une jointure est réalisée entre une grosse table d'input et deux petits subsets d'une table de mapping. Dans le script 2, aucune jointure n'est réalisée à partir de la table d'input. Dans le cas du script 1, des index sont présents sur les colonnes utilisées pour réaliser la jointure, tant au niveau de la table d'input qu'au niveau de la table de mapping. Malgré cela, la jointure peut-elle expliquer une si grande différence de performance entre les deux scripts? Une autre chose qui est différente entre les deux scripts est que dans le script 1, on utilise des fonctions "customs" (pour convertir certains champs de type date) tandis que dans le script 2, on n'utilise que des fonctions "built-in". Cela peut-il avoir un impact sur les performances? D'avance, merci pour vos réponses. |
|
|
00
|
|
|
#2 | |
![]() ![]() |
Citation:
Oui, c'est certain, ça dépend vraiment de comment est écrite la fonction.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#3 | ||||
|
Membre à l'essai
![]() Inscription : juillet 2007 Messages : 108 ![]() |
Voici l'explain plan obtenu dans toad. Pour ce test, la table d'input contient 2500000 records.
Code :
Code :
|
||||
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() Inscription : septembre 2008 Messages : 84 ![]() |
Bonjour,
Je suppose que si la différence viens de la fonction "custom", cela doit être visible en ne s'intéressant qu'aux selects, en dehors des inserts. Peut être aussi que le la différence vient des index qui doivent être maintenus à jour sur les deux tables : il y en a peut etre plus sur la table 1 ? |
|
|
00
|
|
|
#5 | ||||
![]() ![]() |
Difficile à relire votre plan, utilisez cette méthode sous Toad (execute as a script) :
Code :
Code :
__________________
Email : http://scr.im/waldar |
||||
|
00
|
|
|
#6 | ||
|
Membre à l'essai
![]() Inscription : juillet 2007 Messages : 108 ![]() |
Voici l'explain plan, qui j'espère sera plus lisible:
Code :
|
||
|
|
00
|
|
|
#7 | ||
![]() ![]() |
C'est le plan de quelle requête celui-ci, la lente ou la rapide ?
Pour la trace, voyez auprès de votre DBA, le fichier sera écrit dans ce répertoire : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Dans votre exemple, votre fonction peut être remplacée par un case. Si vous avez N fonctions exécutez pour chaque enregistrement disons M il y a des forte chances que vous allez faire N * M changement de contexte entre le moteur SQL et PL/SQL. C’est à éviter. Bien sûr, sans trace SQL il sera hasardeux d’expliquer toute la différence de temps d’exécution par ce phénomène.
|
|
|
00
|
|
|
#9 | ||||
|
Membre à l'essai
![]() Inscription : juillet 2007 Messages : 108 ![]() |
@mnitu, merci pour cette explication.
Voici deux traces que j'ai générées avec 'SET AUTOTRACE'... Script 'lent': Code :
Code :
Que signifie la partie "physical write total multi block requests" ? D'avance, merci. |
||||
|
|
00
|
|
|
#10 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Statistics Descriptions
Citation:
|
|
|
|
00
|
|
|
#11 | ||||
|
Membre à l'essai
![]() Inscription : juillet 2007 Messages : 108 ![]() |
Voilà, j'ai pu obtenir les traces. C'est la première fois que j'en analyse donc je m'en vais chercher de la documentation sur comment interpréter cela. Peut-être quelque chose va-t-il déjà vous sauter aux yeux ; )
1) Pour le script lent : Code :
Code :
D'avance, merci. Brolon |
||||
|
|
00
|
|
|
#12 |
![]() ![]() |
Effectivement il y a énormément de temps CPU sur l'exécution et c'est très probablement lié aux fonctions. Est-ce qu'il est possible d'avoir les requêtes SQL ?
Vous pouvez modifier les noms d'objets si nécessaire, l'important est de conserver la logique.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Je n’aime pas les statistiques pour current et disk. Ca me fait penser à une requête qu’utilise trop d’espace temporaire. C’est quoi le paramètre workarea_size_policy ?
Comme il y a peu d’informations disponibles : nada requête, nada détails des fonctions PL/SQL, nada version d’Oracle, nada… il est assez difficile de se prononcer. De toute façon, un test simple où les fonctions PL/SQL seront remplacées par Null ou une valeur en dur devrait donner une très bonne idée sur la partie consommé par ces fonctions. |
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Juste une autre précision stp.
Est ce que la table dans laquelle tu insères avec le script 1 est la même que celle avec le script 2 ? Si non, y aurait il des différences concernant notamment les foreign keys, comme une avec l'autre sans ? Si c'est le cas il est possible que le /*+ APPEND*/ du script 1 soit en fait ignoré, cela pourrait expliquer la grosse différence de redo dans les AUTOTRACE fournis précédemment. Quelques lectures sur asktom à ce sujet : http://asktom.oracle.com/pls/asktom/...:5280714813869 http://asktom.oracle.com/pls/asktom/...46503539619819 Après c'est vrai qu'il y a une grosse différence de CPU, et je ne pense pas que générer du redo soit très CPUèsque mais plutôt IOèsque, mais ça demande la confirmation de gens plus expérimentés que moi. Citation:
|
|
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
|
|
|
00
|
|
|
#16 |
|
Membre à l'essai
![]() Inscription : juillet 2007 Messages : 108 ![]() |
Désolé du manque d'imprécision dans les renseignements que je donne. Pour tenter de remédier à cela, je peux dire qu'une seule fonction est utilisée, uniquement dans le script "lent". Le code de cette fonction apparaît un peu plus haut dans le fil de discussion.
Suivant vos conseils, j'ai retiré l'affectation des colonnes alimentées via la conversion de dates ainsi que celle des colonnes alimentées via la table de codage. La requête s'exécute en effet plus rapidement (sur un échantillon de 2500000 records, je passe de 6 min à 3 min 30 sec). Toutefois, la requête "rapide" sur un échantillon de 2500000 s'exécute en 16 sec. Il y a donc quand même quelque chose d'autre. Je pourrai fournir plus d'information demain lorsque je serai de retour au travail. Merci pour vos conseils et votre patience envers le débutant que je suis ;-) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com