|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Gilles HUG Inscription : juillet 2010 Messages : 3 ![]() |
Bonjour
C'est ma première demande.... J'ai un souci de performance avec cette requête stockée. Code :
Le tout tourne sous db2 et iserie 520 avec version OS 5.4. Cette requête dure en moyenne 8 heures. En mettant un index sur la table C, je suis descendu a 5 heures mais je trouve que cela fait encore beaucoup. Ce n'est pas moi qui ait développé ces requêtes mais je les "récupère" suite à un départ. Je ne suis pas un cador en SQL. Merci aux bonne volontés de m'orienter vers certaines pistes (si c'est possible) pour tenter d'améliorer les temps d'exploitation. Là je sèche un peu. Les tables ne sont pas énormes TABLE A = 75400 et TABLEC=320000 |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
bonjour,
As-tu pu identifier la partie de ta procédure qui étaient la plus longue ? (DBMON) Sinon pourrai-tu indiquer précisément les index en place sur tes tables. Et enfin quand tu passe cette proc-stock es-tu en concurrence avec d'autre process ? Qu'appel-tu table A et table C sachant que tu as 3 tables distincts ? edit: - Est-ce normal que tu n'update pas la date d'archivage dans T_ARCHIVES apres ton process ? - Une étape d'archivage va bouger en gros combien de % de lignes de table de prod ? |
|
|
00
|
|
|
#3 | ||||
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
Tout d'abord, bienvenu sur ce forum.
Avec une volumétrie comme la tienne et vu ce que tu veux faire on va rester en dessous des 5 secondes. Let's go (ne pas sauter d'étapes) : 1) On va s'assurer que c'est bien le moteur SQE qui traite les requêtes et non le bieux moteur CQE. Supprime le fichier QUSRSYS/QAQQINI s'il existe. Fait un CRTDUPOBJ de QAQQINI de QSYS vers QUSRSYS en copiant tout (+ contraintes). sous STRSQL tu fais : Code :
2) On va revoir le contenu de ta procédure Tes "IN" successifs ne sont pas bons, il faut travailler plutôt avec des jointures. Mais dans ton cas, personellement je n'aurais pas déclaré de curseur, un seul INSERT et un seul DELETE sous commiment control : Code :
3) Maintenant il faut s'assurer que tu es les bons index : - Sur les tables DBPROD.T_HISTACTU et DBPROD.TJ_POURS il te faut un index sur OID_OPERA - Sur les tables DBPROD.TJ_POURS et DBPROD.T_ARCHIVES il te faut un index sur ID_FACTURE, ID_ARTICLE |
||||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
attention K2R400, il me semble que tu as oublié la condition WHERE AA_DATARCH IS NULL sur la table T_ARCHIVE du coup l'indexation devrait suivre aussi.
De plus cette solution pose un problème si le SI est encore actif, on pourrait tres bien supprimer des lignes de la table de prod sans quelles soient archivées ! |
|
|
00
|
|
|
#5 | |
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
Citation:
Non c'est impossible, c'est le principe du niveau d'isolation RR (Repetable Read) qui verrouille les enregistrements lus. |
|
|
|
00
|
|
|
#6 | ||
|
Membre actif
![]() Inscription : juin 2008 Messages : 146 ![]() |
Je ne reviens pas sur les différents moyens d'optimisation.
Ceci dit, quand on souhaite insérer dans une table historique après suppression dans une table de gestion, le moyen le plus simple et le plus rapide, c'est de se servir d'un trigger. De cette manière, tu n'es pas obligé de travailler en 2 temps et de multiplier par 2 tes temps de réponses. En plus, tu restes cohérent dans le SI, puisque INSERT dans Histo et DELETE dans Gestion sont dans la même UR, le ROLLBACK de l'un entrainant le ROLLBACK de l'autre, le COMMIT de l'un entrainant le COMMIT de l'autre. Prenons une table de 5 colonnes que tu souhaites historiser dans une table de même définition + une 6ème colonne contenant le timestamp d'historisation (c'est souvent une information importante). Le trigger serait : Code :
|
||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Citation:
Reprenons l'algo : Table 1 : on sélectionne des enregistrements que l'on insere dans T2 selon une sélection précise sur T3. Table 1 : on delete des enregistrements selon une selection precise sur T3. Rien n'indique qu'entre les 2 étapes il n'y ai pas de nouveau enregistrement sur notre table t3, qui n'ont aucune raison d'être locké par le mode RR. Ces enregistrements peuvent prendre part à la sélection de la 2eme étape => données non archivées supprimées. non ? |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
@pdz74,
c'est une excellent idée : les triggers. @punkoff, Le niveau d'isolation RR empêchera toute insertion, suppression et modification d'enregistrements lus, non encore "commités". Ainsi pour reprendre ton exemple, on ne pourra jamais toucher au contenu de T3 entre la première requête et le commit final (excepté si c'est dans la même transaction). |
|
|
00
|
|
|
#9 | ||||||
|
Invité de passage
![]() Gilles HUG Inscription : juillet 2010 Messages : 3 ![]() |
Bonjour
D'abord merci pour toutes ces réponses. J'ai plusieurs piste à explorer semble-t-il Pour répondre au diverses questions @punkoff Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
@KR2400 Merci pour ton aide, je vais examiner cela de plus près. Je un peu de temps vu que le traitement passe 1 fois par an.Et que je suis seul sur le coup. @pdz74 Je précise que les tables ne sont pas journalisées. Est-ce la solution avec trigger reste valable.Je vais étudier cela aussi. A tous, c'est bon de savoir qu'on est pas tout seul . merci. Je vais faire mes tests et reviendrai vers vous dans quelques temps
|
||||||
|
|
00
|
|
|
#10 |
|
Membre actif
![]() Inscription : juin 2008 Messages : 146 ![]() |
Bonjour,
La définition du trigger que je t'ai donné est simple : Lors de toute suppression dans la table TABJOUR, il y aura une insertion automatique dans la table TABHIST. Peu importe que tes suppressions soient journalières, hebdomadaires, mensuelles, ... Peu importe que ce soit un programme TP, Batch, ou un spufi qui fasse les DELETE. Ce sera pris en compte, c'est automatique, ça assure l'intégrité des données et ça divise par 2 tes temps de réponse. Bref que des avantages !!! @+ |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Gilles HUG Inscription : juillet 2010 Messages : 3 ![]() |
Bonjour
Finalement, j'ai pu faire assez rapidement mes tests. 1) Le fichier QAQQINI n'existait pas dans QUSRSYS, je l'ai donc créé comme demandé. La valeur contenue à l'origine dans QQPARM était '*DEFAULT'. J'ai fait tourner avec cette seule modif et on a gagné encore 1h30 ---> 3h30 2) Mais la vraie valeur ajoutée fut de recoder la requête comme préconisé par K2R400. Moins d'une minute avec des résultats conformes à mes attentes Assez sidérant comme différence au passage.3)Le trigger est une excellente idée que je testerai aussi. Il faut que je voie par rapport au specs de l'appli si l'archivage doit être systématique lors d'un delete 4) Merci encore pour votre aide, ça m'a bien fait progresser. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com