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

Oracle Discussion :

Comment Eviter le dual(consommateur)


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Par défaut Comment Eviter le dual(consommateur)
    select count(*) as alias1
    From Dual D
    WHere exists ( select a.col1, b.col2
    From taba a
    left outer join tabb b on a.col4=b.col5
    where a.col6=2
    a.col7=2
    a.col8=9
    and b.col7=8)
    )
    cette requete (oracle 9ir2) retourne 1 si le contenu de la sous requete ramene 1 ou plusieurs lignes .
    retourne 0 sinon

    Voici son plan d''execution


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1982 Card=1)
    1 0 SORT (AGGREGATE)
    2 1 FILTER
    3 2 TABLE ACCESS (FULL) OF 'DUAL' (Cost=1982 Card=1)
    4 2 TABLE ACCESS (BY INDEX ROWID) OF 'Tabb' (Co
    st=2 Card=1 Bytes=56)

    5 4 NESTED LOOPS (Cost=3 Card=1 Bytes=97)
    6 5 TABLE ACCESS (BY INDEX ROWID) OF 'taba' (Cost=2 Car
    d=1 Bytes=41)

    7 6 INDEX (RANGE SCAN) OF 'INN_taba_10' (NON-UNIQUE)
    (Cost=4 Card=2)

    8 5 INDEX (RANGE SCAN) OF 'AK_Tabb' (NON-UNIQUE) (Cost=1 Card=1)


    queqlu''un a une idée comment eviter le dual(trop consommateur), le principe est d'afficher le resultat 1 quand il ya des lignesramenées par la sous requete et 0 sinon.


    Merci d'avance!!!

  2. #2
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select 1
                         From  taba a
                         left outer join tabb b on a.col4=b.col5
                         where a.col6=2
                         a.col7=2
                         a.col8=9                     
                         and b.col7=8
    and rownum = 1

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Par défaut
    Merci pour votre reponse, mais le 1 est affiché dans les deux cas, cette transforamtion ne reponds pour le cas vide avec 0,

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    si le coût est si important sur DUAL c'est probablement un problème de stats... dual n'est absolument pas consommateur avec sa colonne unique et sa seule ligne

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Reprenons le code de Loyd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT NVL(COUNT(1),0)
    From  TABA a  left outer join TABB b on a.col4=b.col5
    where a.col6=2
    AND a.col7=2
    AND a.col8=9                     
    and b.col7=8
    and rownum = 1
    Renvoie 1 si 1+ ligne, 0 si 0 lignes


    PS : Ne pas mettre de nom de colonnes dans un EXISTS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE EXISTS (SELECT 1 FROM

  6. #6
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Citation Envoyé par Mehdilis Voir le message
    Merci pour votre reponse, mais le 1 est affiché dans les deux cas, cette transforamtion ne reponds pour le cas vide avec 0,
    Tout dépend comment est utilisé cette requête:
    En pl/sql, il suffit juste de jouer avec l'exception no_data_found
    En sql pur, aucune valeur ne sera retourné et la variable stockant le résultat vaudra NULL

    Expliques nous d'avantage comment cette requête est utilisée au sein de ton traitement, on pourra mieux adapter nos réponses

Discussions similaires

  1. [JS][XP] Le SP2 bloque mes scripts, comment eviter sa?
    Par Devil666 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/04/2005, 12h29
  2. Réponses: 5
    Dernier message: 10/03/2005, 17h41
  3. Comment eviter de dedoubler projet c++ et projet java/applet
    Par buzzz dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 13/10/2004, 13h02
  4. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04
  5. [opengl] Comment eviter l'ordre de faces ?
    Par :GREG: dans le forum OpenGL
    Réponses: 3
    Dernier message: 02/03/2004, 19h14

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