|
Publicité | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Bonjour à tous.
J'ai besoin de votre aide sur une procédure qui met un certain temps à s'exécuter. Je pense avoir repérer l'instruction qui pose problème : Code :
Code :
La table RF_VOLUMEPREPREAL contient un grand nombre d'enregistrements (environ 10 millions). Elle contient des UO par jour. Or, tous les jours ne sont pas renseignés. Ma procédure consiste donc à "boucher les trous" par des 0 entre les dates retournées par la première requête. Je crois que le problème vient du fait que je fais un insert sur un table qui est elle même interrogée par le select... Merci de votre aide. Dernière modification par Superdub ; 19/05/2009 à 14h56. |
||||
|
|
00
|
|
|
#2 | ||
|
Membre confirmé
![]() Inscription : janvier 2006 Messages : 178 ![]() |
En général, Oracle n'aime pas les NOT IN ... Et si on essayait un NOT EXISTS ?
Code :
|
||
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 143 ![]() |
|
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Inscription : janvier 2006 Messages : 178 ![]() |
Citation:
Cela ne s'appuie effectivement que sur mon expérience personnelle (sous Oracle 10gR1 et R2). Dans un cas comme celui-ci, il est bon d'essayer le NOT IN et le NOT EXISTS et de les comparer. De ma propre expérience, Oracle a mieux géré le NOT EXISTS de l'ordre de 9 fois sur 10, je préfère donc maintenant commencer par le NOT EXISTS et me tourner vers le NOT IN si je rencontre un souci, plutôt que l'inverse Maintenant cela dépend bien entendu de la requête, de la version d'Oracle, des données, des indexes... D'une manière générale quand une requête rencontre des problèmes de performance, il est bon d'essayer d'autres façons de l'écrire (tout en analysant le plan d'exécution et en indexant mieux si nécessaire). Je reformule : Citation:
|
||
|
|
00
|
|
|
#5 | ||||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Merci beaucoup pour la réponse, je commence à désespérer avec mes problèmes de performances (eh oui, ce n'est pas le seul, new topic coming soon
Voici le EXPLAIN PLAN pour le NOT IN : Code :
Code :
Mais j'ai bien l'impression que rien ne change entre les deux versions ... |
||||
|
|
00
|
|
|
#6 | ||
|
Membre expérimenté
![]() Inscription : juillet 2007 Messages : 495 ![]() |
Est-ce que tourné comme ça, ça fait améliorer le schmilblcik ?
Code :
__________________
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche ! |
||
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Merci pour la réponse.
D'après le EXPLAIN PLAN, cette méthode n'améliore pas les performances mais c'était bien vu ! Code :
|
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 143 ![]() |
|
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 177 ![]() |
Salut,
Il nous faudrait plus d'information. C'est quoi "une procédure qui met un certain temps à s'exécuter" et quel est le temps maximal souhaité. Sinon concernant tes requêtes, c'est quoi curETB, curCP, curPDV, des curseurs ? Si c'est le cas en as tu vraiment besoin, parceque des curseurs sur des tables de 10 millions de lignes c'est très contre performant. |
|
|
00
|
|
|
#10 | |
![]() ![]() |
Citation:
Comme il y en a beaucoup ça prend du temps même si l'insert en lui-même se passe bien. Solution : faire de l'ensembliste ! Edit : grilled !
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Pour expliquer, ma base de données contient des établissements (ETB), qui possède des circuits de préparation (CP), qui sont reliés à des points de vente (PDV). Pour chaque triplet ETB, CP, PDV sont associés un UO par JOUR.
Ces UO sont renseignés partiellement dans la table RF_VOLUMEPREPREAL par chargement de fichier. (Tous les jours ne sont pas renseignés pour chaque triplet). Il faut donc combler les jours manquant par des 0. Je fais donc : Pour chaque ETB Pour chaque CP(ETBCourant) Pour chaque PDV(CPCourant) Insertion de 0 pour les dates manquantes. Pour les temps de traitement, au terme du remplissage partiel, 10 Millions de lignes sont renseignées dans la table RF_VOLUMEPREPREAL, ce qui représente environ 20%, les 80% restants étant complétés par cette procédure. Actuellement cette procédure s'effectue en une dizaine d' heures ... |
|
|
00
|
|
|
#12 | ||
![]() ![]() |
Ce qui plombe vos performances c'est le triple curseur.
Vous pouvez (devez) probablement arriver à vos fins en une seule et unique requête. Essayez ceci en étant raisonnable sur la plage de date : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 177 ![]() |
C'était donc bien un euphémisme
Suis les conseils de Waldar, ton problème sur la vue me dis que tu peux adapter ta procédure seul, mais si tu as des difficultés, post le code de la proc. [EDIT]:Y a même plus qu'un conseil
|
|
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 143 ![]() |
Citation:
C'est un peu à ça que je pensait moi aussi, mais je voudrais que quelque'un le dise. Et ce n'est pas ça ? Sinon, j'ai une autre question (après avoir lu le réponse): Et pour quoi veut-on inserer des 0 pour les dates manquantes ? [Edit] Ca va vite sur ce sujet [/Edit] |
|
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Merci waldar pour cette requête. Je viens de la tester et elle s'exécute très vite (environ 10 secondes). Il ne me reste plus qu'à la coupler avec le insert et le tour est joué. Je reviens vers vous plus tard pour vous donner mes conclusions.
Merci. [EDIT] Arf, après étude, ça correspond en partie à ce que je voulais ... Je vais rajouter deux difficultés :
Désolé, j'aurais du donner ces précisions un peu plus tot... Dernière modification par Superdub ; 19/05/2009 à 17h43. |
|
|
00
|
|
|
#16 |
![]() ![]() |
Mon tarif est de 1 € par seconde gagnée
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#17 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 143 ![]() |
Mais, je reste persuadé qu'en fait il n'y nul besoin de cette procédure
|
|
|
00
|
|
|
#18 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Houlala
Sinon, avec l'ajout d'une nouvelle page sur le topic, je précise que j'ai édité le message d'avant pour corser l'affaire @mnitu : si, si rassure toi, elle a son utilité |
|
|
00
|
|
|
#19 |
![]() ![]() |
Est-ce que vous utilisez toujours la table RF_VOLUMEPREPREAL pour faire votre triplet ou bien avez-vous des tables de référence dédiées ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#20 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 28 ![]() |
Il y a une table ETABLISSEMENT. Et une table pour les couples CP et PDV selon un referentiel (il y plusieurs référentiels par établissement, ici, un seul nous interesse).
Je pense que je peux faire une vue répertoriant l'ensemble des triplets pour le référentiel qui nous intéresse. Je posterai demain cette vue. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com