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 :

Sous-requête excutée plusieurs fois dans une requête


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Sous-requête excutée plusieurs fois dans une requête
    Bonjour,

    Je dois optimiser une requête trop longue à exécuter sur une base Oracle 9.2.

    Cette requête assez complexe de 500 lignes comprends notamment l'exécution d'une sous-requête :

    select count(*) from ... where ...

    Cette sous-requête est exécuté 5 fois dans la requête principale avec la même syntaxe.

    Je me dis que l'optimiseur Oracle est capable de constater la répétition de cette sous-requête et qu'il ne l'effetuera qu'une seule fois mais je n'en suis pas certain ...

    Serait-il possible en dehors de l'aspect optimisation, pour l'aspect lisibilité et concision, de procéder au début de mon script à l'exécution de cette sous-requête dont le résultat serait stocké dans une variable spéciale ou pourquoi pas dans une table non physique ?

    Je vous remercie de vos réponses.

  2. #2
    Expert éminent sénior
    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
    Points : 19 075
    Points
    19 075
    Par défaut
    une astuce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH query_count AS (select count(*) nb from ... where ...)
    SELECT ...
    FROM ... , query_count qc
    WHERE col = qc.nb

  3. #3
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Serait-il possible en dehors de l'aspect optimisation, pour l'aspect lisibilité et concision, de procéder au début de mon script à l'exécution de cette sous-requête dont le résultat serait stocké dans une variable spéciale ou pourquoi pas dans une table non physique ?
    Oui, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    drop table t1;
    drop table t2;
    drop table tc;
     
    create table t1 (x int, y int);
    create table t2 (x int, y int, z int);
     
    create global temporary table tc (cnt number);
     
    insert into tc select count(*) from t1;
     
    select x from t2 where y = (select cnt from tc) and z <> (select cnt from tc);
    Il y a probablement d'autres solutions possibles avec la clause WITH.

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Merci
    Beaucoup pour ces réponses rapides et limpides

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'essaie de penser à la balise 'CODE' la prochaine fois :)

  5. #5
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Exemple avec WITH:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    with qtc as (select count(*) from t1)
    select x from t2 where y = (select * from qtc) and z <> (select * from qtc);

  6. #6
    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
    Citation Envoyé par pifor
    Exemple avec WITH:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    with qtc as (select count(*) from t1)
    select x from t2 where y = (select * from qtc) and z <> (select * from qtc);
    ou même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select x from t2 where y = (select count(*) from t1) and z<>y;

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Ne pas oubliez également la vue en ligne (IN LINE view) définie dans la partie FROM de l'ordre Select et exécutée une fois pour toute.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 10
    Points : 10
    Points
    10
    Par défaut clarification
    Tout d'abord merci pour vos réponses.

    J'ai pu constater que l'optimiseur Oracle fonctionnait plutôt bien puisque le temps d'exécution de ma nouvelle requête est le même que l'ancienne requête.
    Afin d'améliorer encore la clartée de ma requête je voudrais inclure dans la clause WITH d'autres sous-requêtes de ma requête principale. Sachant que j'ai déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH query_count AS (SELECT COUNT(*) nb
                                    FROM ...)
    SELECT ...
    ||
    WHEN ...
      THEN CASE qc.nb
        WHEN ...
    ||
    (SELECT ... FROM ...)
    ||
    ...
    FROM query_count qc, ...
    WHERE ...
    Le but est de sortir le code en gras de la requête principale.

    Merci.

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    J'ai trouvé, c'était pas sorcier

    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
     
    WITH query_count AS (SELECT COUNT(*) nb
                                    FROM ...),
            query_param AS (...),
            query xxx AS ...
    SELECT ...
    ||
    WHEN ...
      THEN CASE qc.nb
        WHEN ...
    ||
    (query_param.xx)
    ||
    ...
    FROM query_count qc, ...
    WHERE ...
    Désolé du dérangement.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2013, 15h29
  2. Appeler dans une requête des variables définies dans une macro
    Par piflechien73 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/08/2009, 15h12
  3. plusieurs comptes dans une requête
    Par sopcc dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/01/2007, 10h50
  4. Plusieurs SUM dans une requête
    Par pj69100 dans le forum Requêtes
    Réponses: 6
    Dernier message: 02/01/2007, 10h34
  5. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59

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