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 :

Optimisation requête avec UNION


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Optimisation requête avec UNION
    Bonjour,

    Je dois faire une requête avec une clause where sur 2 champs. Le problème est que je dois faire 3 combinaisons sur ces 2 champs. Voici la première requête que j'ai essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM matable
    WHERE (champ1 = 'test1' AND champ2 = 3) OR (champ1 = 'test2' AND champ2 = 5) OR (champ1 = 'test3' AND champ2 = 1)
    Cette requête n'a pas fonctionnée, je me suis donc tourné vers UNION, mais je ne suis pas satisfait de cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM matable
    WHERE champ1 = 'test1' AND champ2 = 3
    UNION
    SELECT *
    FROM matable
    WHERE champ1 = 'test2' AND champ2 = 5
    UNION
    SELECT *
    FROM matable
    WHERE champ1 = 'test3' AND champ2 = 1
    N'y a t-il pas une meilleure façon de faire ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    que veux dire "n'a pas fonctionné" ?

    Votre 1ere solution est sans doute la meilleur et doit fonctionner.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Lorsque j'ai essaye la première solution, aucun résultat n'a été retourné. Je vais réessayer, j'ai peut être commis une erreur !

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par vaccary Voir le message
    Bonjour,

    Je dois faire une requête avec une clause where sur 2 champs. Le problème est que je dois faire 3 combinaisons sur ces 2 champs. Voici la première requête que j'ai essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM matable
    WHERE (champ1 = 'test1' AND champ2 = 3) OR (champ1 = 'test2' AND champ2 = 5) OR (champ1 = 'test3' AND champ2 = 1)
    Cette requête n'a pas fonctionnée, je me suis donc tourné vers UNION, mais je ne suis pas satisfait de cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM matable
    WHERE champ1 = 'test1' AND champ2 = 3
    UNION
    SELECT *
    FROM matable
    WHERE champ1 = 'test2' AND champ2 = 5
    UNION
    SELECT *
    FROM matable
    WHERE champ1 = 'test3' AND champ2 = 1
    N'y a t-il pas une meilleure façon de faire ?
    Bonjour,

    Executez les deux requêtes et postez ici les deux "explain plan" afin que l'on puisse mesurer la différence. Pourriez vous avant de lancer les deux requêtes en question faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    alter session set statistics_level=ALL;
    set linesize 150;
    Afin d'obtenir ces "explain plans" je vous conseille de faire suivre la fin de votre requête par la commande sql suivante (qui extrait l'explain plan à partir de la mémoire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    Bien respectueusement

    Mohamed Houri

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci pour votre aide. Je sais désormais pourquoi ça ne fonctionnait pas, le serveur sur lequel est la BDD est en train de tomber en rade, notre administrateur BDD se bat avec depuis plusieurs heures !

    Désole pour la gène occasionnée,
    Vincent

  6. #6
    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
    Attention, UNION applique un DISTINCT, le résultat sera donc différent de la requête initiale. l'équivalent de OR et UNION ALL

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci pour cette précision, toujours bon a savoir !

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Attention, UNION applique un DISTINCT, le résultat sera donc différent de la requête initiale. l'équivalent de OR et UNION ALL
    Je dirais justement que si les conditions dans le OR n'étaient pas exclusives, un UNION ALL dédoublerait des lignes présentes une seule fois dans une requête par OR.

    Là de toute façon les conditions sont exclusives, on est donc sûr que chaque ligne ne peut être ramenée que par une des conditions, donc l'avantage du UNION ALL c'est la peformance (pourquoi s'assurer qu'il n'y a pas de doublons quand on sait qu'il ne peut pas y en avoir ?).

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

Discussions similaires

  1. Optimisation d'une requête avec UNION ALL
    Par jgfa9 dans le forum Requêtes
    Réponses: 11
    Dernier message: 01/08/2012, 21h53
  2. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  4. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 16h50
  5. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02

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