IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème de lenteur lors de l'exécution d'une requête en pl/sql


Sujet :

PL/SQL Oracle

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Par défaut Problème de lenteur lors de l'exécution d'une requête en pl/sql
    Bonjour,

    J'ai un problème pour la création d'une requête en PL/SQL (Oracle).

    Voici le problème,
    Je dois afficher des données mensuelles pour les diffèrents produits que nous avons (nombre totals de produit par mois, la moyenne du nombre de produit journalier, le pic du nombre de produit dans le mois et la date de ce pic) comme suit :

    Dans un mois nous pouvons avoir plusieurs date pour un même pic.
    [IMG]C:\tmp\tabDonnesPrdt.bmp[/IMG]

    Pour cela je voudrai faire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select	to_char(eventdate, 'yyyy/mm') as MOIS,
    	Nom_Produit as Nom,
    	SUM(Nb_Produits) as Nb_de_produits_Total, 
    	AVG(Nb_Produits) as Moyenne_nb_de_produits_journalier, 
    	MAX(Nb_Produits)  as Pic_Nb_Produit,
    	date as Date_Du_Pic
          from historic_1656379283 
          group by to_char(eventdate, 'yyyy/mm'),Nom_Produit
          order by  to_char(eventdate, 'yyyy/mm') desc;
    Le problème est au niveau de l'affichage de la Date du pic, je ne peux pas le mettre dans le regroupement(group by) car sinon je n'ai plus les moyennes et les sommes par mois mais par jour.
    Cette requête envoie donc une erreur si je ne mets pas date dans le group by.

    Pour contourner le problème j'ai créé deux curseurs une qui me donne tout les résultats sauf la date du pic et l'autre qui récupère la date du pic en fonction du mois, de nom du produit et du pic récupérés par les résultats du premier curseur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Curseur statProduit is
    select	to_char(eventdate, 'yyyy/mm') as MOIS,
    	Nom_Produit as Nom,
    	SUM(Nb_Produits) as Nb_de_produits_Total, 
    	AVG(Nb_Produits) as Moyenne_nb_de_produits_journalier, 
    	MAX(Nb_Produits)  as Pic_Nb_Produit
          from historic_1656379283 
          group by to_char(eventdate, 'yyyy/mm'),Nom_Produit
          order by  to_char(eventdate, 'yyyy/mm') desc;
     
    Curseur DatePic(mois varchar, nomPdt varchar, picduMois int) is
    select	date as Date_Du_Pic
          from historic_1656379283 
          Where Nom_Produit = nomPdt 
          	   and to_char(eventdate, 'yyyy/mm')=mois
          	   and Nb_Produits=picduMois
          group by to_char(eventdate, 'yyyy/mm'),Nom_Produit
          order by  to_char(eventdate, 'yyyy/mm') desc;
    Ce qui me donne le code suivant dans le begin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    begin
     
      OPEN statProduit;
           LOOP
           FETCH statProduit INTO ChaquestatProduit;
           Exit when statProduit%NOTFOUND ;
     
                 OPEN DatePic(ChaquestatProduit.MOIS,ChaquestatProduit.Nom,ChaquestatProduit.Pic_Nb_Produit);
                 LOOP
                 FETCH DatePic INTO ChaqueDatePic;
                       Exit when DatePic%NOTFOUND ;
     
                        REQ:='insert into TAB_STATSCRE_MEMensuel(MOIS,NOMPDT,MOYENNEPDT,PICPDT,DATE_DU_PIC) values (' || '''' || ChaquestatProduit.MOIS   || '''' ||  ',' || '''' || ChaquestatProduit.Nom || '''' || ',' || '''' || ChaquestatProduit.Nb_de_produits_Total || '''' || ',' || '''' || ChaquestatProduit.Pic_Nb_Produit || '''' || ',' ||  '''' || ChaqueDatePic.Date_Du_Pic || '''' || ')';
                        dbms_output.put_line('insert into TAB_STATSCRE_MEMensuel(MOIS,NOMPDT,MOYENNEPDT,PICPDT,DATE_DU_PIC) values (' || '''' || ChaquestatProduit.MOIS   || '''' ||  ',' || '''' || ChaquestatProduit.Nom || '''' || ',' || '''' || ChaquestatProduit.Nb_de_produits_Total || '''' || ',' || '''' || ChaquestatProduit.Pic_Nb_Produit || '''' || ',' ||  '''' || ChaqueDatePic.Date_Du_Pic ||  '''' || ')');
                        EXECUTE IMMEDIATE REQ;
                 END LOOP;
                 CLOSE DatePic;
           END LOOP;
     CLOSE statProduit;
    Le problème de cette méthode et qu'elle prend enormément de temps à s'exécuter lors de la recherche de la date pour chaque ligne (pour 400 lignes de résultat = env 1h)

    Y'a t'il un moyen de récupérer la date avec la première requête sans mettre la date dans le group by?
    Ou bien avez vous une idée pour réduire le temps de recherche de la date?

    Merci d'avance.
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur bizarre lors de l'exécution d'une requête
    Par Mr. NoReaction dans le forum JDBC
    Réponses: 1
    Dernier message: 05/11/2008, 21h22
  2. Erreur lors de l'exécution d'une requête avec ADOquery
    Par doolar dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/05/2008, 13h26
  3. [PostgreSQL] [PostGreSQL] Obtention d'une erreur lors de l'exécution d'une requête
    Par cbombabill dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2008, 11h56
  4. Réponses: 8
    Dernier message: 17/09/2007, 20h16
  5. Réponses: 1
    Dernier message: 05/12/2005, 23h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo