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 :

Lenteur De Requete


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut Lenteur De Requete
    Bonjour,
    J'ai un probleme bizzare :

    j'ai une fonction ma_fonction(mon_param) qui retourne un number

    quand j'appel la fonction comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ma_fonction(1) from dual;
    pas de probleme et la fonction retourne le resultat en une seconde.
    jusqua la pas de probleme.

    j'ai créé une vue qui appel la fonction et qui lui passe le parametre mon_param:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create or replace vue ma_vue as 
    select ma_fonction(colonne)from ma_table
    sachant que colonne est indéxé.

    la requete est tres tres lente meme qu'elle ne donne jamais le resultat et reste en attente d'execution.
    le nombre de ligne de la table ma_table : 1975
    j'ai cherché un peu sur le net jai essayé de mettre la fonction en
    PARALLEL_ENABLE
    PRAGMA AUTONOMOUS_TRANSACTION
    mais le resultat et le meme!
    ya il quelque chose que j'ai oublié de faire ?

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Quelle est le code de la fonction? Que fait-elle précisément?

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    voici le code de la fonction
    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
    43
    44
     
    CREATE OR REPLACE FUNCTION F_ENCOURS(
            p_typefich varchar2,
            p_codregtp number, 
            p_numeproj number,
            p_numeoper number,
            p_dd date,
            p_df date)        
    RETURN NUMBER PARALLEL_ENABLE IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    tmpVar number;
    BEGIN
     
    BEGIN    
     
       SELECT   sum(nvl(tpo.NOMTOTTY,0))
       INTO     tmpVar
       FROM     operation o,
                com_operation co,
                com_type_produit tp,
                com_typeproduit_operation tpo,
                REGROUP_C_TYPE_PRODUIT_DETAIL rctpd,
                REGROUP_COM_TYPE_PRODUIT rctp
        WHERE   rctp.TYPEFICH   = rctpd.TYPEFICH
        AND     rctp.CODREGTP   = rctpd.CODREGTP
        AND     rctpd.CODTYPPR  = tp.CODTYPPR
        AND     tpo.CODTYPPR    = tp.CODTYPPR 
        AND     tpo.CODEOPER    = co.codeoper
    	AND     co.numeproj     = o.numeproj
    	AND     co.numeoper     = o.numeoper
        AND     rctp.TYPEFICH   = p_typefich
        AND     o.numeproj      = nvl(p_numeproj,o.numeproj)
        AND     o.numeoper      = nvl(p_numeoper,o.numeoper)
        AND     rctpd.CODREGTP  = p_codregtp
        AND     o.DAMIENCH between p_dd and p_df
    	AND     o.DATEACHE > To_date('3112'||To_char(p_df,'yyyy'),'ddmmyyyy');
     
       RETURN tmpVar;
       EXCEPTION
         WHEN OTHERS THEN
           RETURN 0;
    END;
    END F_ENCOURS;
    /
    elle retourne pour une operation le nombre de produit qui sy trouvent

    et voici la requete de la vue

    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
    SELECT   
                          numeproj,
                          numeoper,
                          desioper,
                          F_ENCOURS (
                             'REAL1',
                             1,
                             numeproj,
                             numeoper,
                             TO_DATE ('01011000', 'ddmmyyyy'),
                             TO_DATE ('3112' || to_char(sysdate,'yyyy') - 1, 'ddmmyyyy')
                          ) x1
    					              F_ENCOURS (
                             'REAL1',
                             1,
                             numeproj,
                             numeoper,
                            TO_DATE ('3112' || to_char(sysdate,'yyyy') - 1, 'ddmmyyyy'),
     
                             TO_DATE ('3112' || to_char(sysdate,'yyyy') , 'ddmmyyyy')
                          ) x2
    					              F_ENCOURS (
                             'REAL1',
                             1,
                             numeproj,
                             numeoper,
                            TO_DATE ('3112' || to_char(sysdate,'yyyy') , 'ddmmyyyy'),
                         TO_DATE ('3112' || to_char(sysdate,'yyyy') + 1, 'ddmmyyyy')
                          ) x3
    elle me donne le nombre pour l'anné -1 l'année en cours et l'année +1

  4. #4
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    voici le code de la vue :
    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
     
    SELECT   
                          numeproj,
                          numeoper,
                          desioper,
                          F_ENCOURS (
                             'REAL1',
                             1,
                             numeproj,
                             numeoper,
                             TO_DATE ('01011000', 'ddmmyyyy'),
                             TO_DATE ('3112' || to_char(sysdate,'yyyy') - 1, 'ddmmyyyy')
                          ) x1,
    					  F_ENCOURS (
                             'REAL1',
                             1,
                             numeproj,
                             numeoper,
                             TO_DATE ('01011000', 'ddmmyyyy'),
                             TO_DATE ('3112' || to_char(sysdate,'yyyy') , 'ddmmyyyy')
                          ) x2,
    					  F_ENCOURS (
                             'REAL1',
                             1,
                             numeproj,
                             numeoper,
                             TO_DATE ('01011000', 'ddmmyyyy'),
                             TO_DATE ('3112' || to_char(sysdate,'yyyy') + 1, 'ddmmyyyy')
                          ) x3
    from operation
    pour toute les operation on doit obtenir le nobre de produits année -1 année en cours et année +1

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Votre fonction est appelée 1975*3 fois, et avec une requête pas forcément optimale. Il y a probablement moyen de penser tout cela autrement.

    Pourquoi 2 blocs BEGIN/END dans la fonction? Un seul suffit.
    Avez-vous des index sur les tables du SELECT?

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Ce n’est pas en passant trois fois par enregistrement par les changements de contexte SQL, PL/SQL que vous allez arriver à optimiser la requête. En plus la requête que vous utilisez dans votre fonction pourrait elle aussi être ré écrite si vous notez que votre somme ne concerne que la table com_typeproduit_operation.
    Abandonnez le PL/SQL et essayez donc d’écrire votre requête en SQL seulement.

  7. #7
    Membre éprouvé
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    Tu pourrais essayer de lancer la requete hors de la vue et avec des restrictions sur ma_table pour voir ce que ca donne. En augmentant la taille de l interval, ca te donnera peut etre des indications. En plus, regarde le plan d execution pour vérifier le cout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ma_fonction(colonne)FROM ma_table Where ColonneID Between x And y

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

Discussions similaires

  1. probleme lenteur de requetes
    Par Babylonne dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/11/2007, 11h53
  2. Réponses: 22
    Dernier message: 02/10/2007, 18h03
  3. Lenteur des requetes
    Par MayOL69bg dans le forum Requêtes
    Réponses: 6
    Dernier message: 24/04/2007, 19h13
  4. Problème de lenteur des requetes
    Par cyberdam dans le forum Installation
    Réponses: 1
    Dernier message: 20/03/2007, 11h25

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