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 9.2.0.7] Nbre d'évaluation d'une requête SQL


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 18
    Points : 11
    Points
    11
    Par défaut [Oracle 9.2.0.7] Nbre d'évaluation d'une requête SQL
    Bonjour à tous,

    J'aimerais avoir une réponse à ceci:

    Dans la requête suivante, le subselect en rouge est il évalué une seule ou plusieurs fois ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select idproj, cat, count(distinct (can||annee||prop||vente||lot)) / (select count(*) from cdp_lots where idproj=2 and sel='O')
    from v_cdp_cat where idproj=2 group by idproj, cat
    Pour info, le COST donné par l'explain plan est le même que si je fais ceci (le nombre 64 est celui renvoyé par le subselect en question) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select idproj, cat, count(distinct (can||annee||prop||vente||lot)) / 64 
    from v_cdp_cat where idproj=2 group by idproj, cat
    Pour moi il execute la subquery pour chaque row du select de base.

    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 171
    Points
    171
    Par défaut
    Bonjour,

    Je pense aussi que la sous-requête est exécutée à chaque fois.
    Un examen du plan d'exec devrait le confirmer.

    Sinon il y a moyen de faire un calcul une seule fois, mais je n'ai pas la syntaxe en tête. Si quelqu'un a une idée, sinon je rechercherai.

    Cdt

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Il était possible de mettre la sous requete dans le FROM mais alors j'ai un problème avec GROUP BY.

    Au niveau de l'explain plan, je dois dire que je ne sais pas où regarder pour savoir s'il exécute la requete plusieurs fois.
    Et c'est un peu chaud de vous exposez l'explain ici vu la tete du plan

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select 
      idproj, 
      cat, 
      count(distinct (can||annee||prop||vente||lot)) / 
      x
    from v_cdp_cat , (
      select count(*) x 
      from cdp_lots 
      where idproj=2 
      and sel='O') 
    where idproj=2 group by idproj, cat,x

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 171
    Points
    171
    Par défaut
    Sinon l'adaptation du code précédent devrait être plus efficace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    with nb as ( SELECT count(*) x 
                FROM cdp_lots 
                WHERE idproj=2 
                 AND sel='O') 
    SELECT 
      idproj, 
      cat, 
      count(DISTINCT (can||annee||prop||vente||lot)) /
            (select x from nb)
    FROM v_cdp_cat 
    WHERE idproj=2 GROUP BY idproj, cat,x

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    mercii beaucoup.. je vais essayer.

    Je ne connaissais pas DU TOUT cette syntaxe avec le with
    Je viens de l'essayer mais il me dit invalid SQL Statement.... euh .. tu l'exécutes dans quoi pour qu'elle fonctionne ???

  7. #7
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Points : 171
    Points
    171
    Par défaut
    oracle 9.2.0.7

    je n'ai pas testé exactement la même requête, c'est possible qu'elle ne soit pas tout à fait juste. C'est quel message d'erreur ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ben en fait, Oracle rale sur le group WITH ... il ne sait pas quoi en faire

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/11/2010, 08h56
  2. Intercepter une requête SQL sous Oracle 9i
    Par cch02 dans le forum Oracle
    Réponses: 4
    Dernier message: 21/07/2010, 14h03
  3. Réponses: 13
    Dernier message: 21/05/2010, 16h54
  4. Réponses: 3
    Dernier message: 12/12/2008, 08h05
  5. nbre d'enregistrement d'une requete SQL "java"
    Par med.jrd dans le forum JDBC
    Réponses: 3
    Dernier message: 06/12/2007, 20h54

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