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

SQL Oracle Discussion :

[Oracle-optimisation] requete recursive complique dans une fonction


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [Oracle-optimisation] requete recursive complique dans une fonction
    Bonjour,

    Je cherche a optimiser la fonction suivante:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE OR REPLACE FUNCTION SERVICES (N_NAME in VARCHAR2) 
    RETURN LIST_SERVICE PIPELINED
    IS 
    RES SERVICE_CUSTOMER := SERVICE_CUSTOMER(null,null,null); -- service customer est une table de type (SERVICE_TYPE_NAME, SERVICE_NAME, CUSTOMER_NAME)
    CURSOR C_LIST_SERVICE IS
       select distinct ST.NAME as SERVICE_TYPE_NAME, S.service_name as SERVICE_NAME, S.customer_name as CUSTOMER_NAME
       from Service S, service_type ST,
          (
             select RCS.service_id 
             from REL_CIRCUIT_SERVICE RCS
             where RCS.circuit_id in
             (
                select RCC.OVERLYING_CIRCUIT_ID
                from REL_CIRCUIT_CIRCUIT rcc
                start with RCC.UNDERLYING_CIRCUIT_ID in (
                      select circuit_id
                      from CIRCUIT C, NETWORK N
                      where N.N_id = C.N_id
                         N.name = N_NAME)
                connect by prior RCC.OVERLYING_CIRCUIT_ID = RCC.UNDERLYING_CIRCUIT_ID
             )
       UNION 
       select RCS.service_id
       from REL_CIRCUIT_SERVICE RCS
       where RCS.circuit_id  in (
                      select circuit_id 
                      from CIRCUIT C, NETWORK N
                      where N.N_id = C.N_id
                      N.name = N_NAME)
       ) All_Service
       where S.service_type_id = ST.service_type_id
          and S.service_id = All_Service.service_id;
    BEGIN
       for serv_custo in C_LIST_SERVICE loop
          RES.SERVICE_TYPE_NAME := serv_custo.SERVICE_TYPE_NAME;
          RES.SERVICE_NAME := serv_custo.SERVICE_NAME;
          RES.CUSTOMER_NAME := serv_custo.CUSTOMER_NAME;
          PIPE ROW (RES);
       end loop;
       return;
    END;
    /
    Comme vous pouvez le remarquer dans mon curseur je repete 2 fois la meme sous requete (mis en vert).
    J'aurai voulu savoir si dans la fonction je ne pouvais pas executer cette requete avec jointure avant l'appel du curseur, mettre le resultat dans une table temporaire et appeler cette table temporaire plutot que d'effectuer la requete deux fois de suite.

    Est-ce que c'est possible? Si ca l'est, comment puis-je le faire?

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pas moyen optimisé de d'insérer dans une table temporaire.
    Par contre tu peux remplacer le 2ème UNION par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT rcs.service_id
    FROM REL_CIRCUIT_SERVICE rcs, CIRCUIT c, NETWORK n
    WHERE rcs.circuit_id  = c.circuit_id 
    AND n.n_id = c.n_id
    AND n.NAME = n_name
    Ca évitera un IN couteux
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour l'information, j'aurai quand meme bien aime que l'on puisse optimiser cette requete .

    En tout cas merci pour l'optmisation que tu me proposes, je m'etais centre uniquement sur l'optimisation que je voulais faire et je n'avais pas vu celle la

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

Discussions similaires

  1. Problème Requete dans une fonction ?
    Par Mr-Chikhi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 13
    Dernier message: 29/04/2009, 16h48
  2. Requete sql dans une fonction
    Par xess91 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2009, 19h29
  3. Réponses: 1
    Dernier message: 26/11/2008, 17h36
  4. Mettre une requete SQL dans une fonction
    Par yenna dans le forum ASP
    Réponses: 3
    Dernier message: 21/06/2007, 10h21
  5. Réponses: 14
    Dernier message: 10/01/2007, 10h12

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