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

Langage SQL Discussion :

Optimisation de requête redondante


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Optimisation de requête redondante
    Bonjour est ce que vous pouvez m'aider à optimiser cette requette :
    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
     
    SELECT  t1a.MSISDN, t2.*
    FROM test2 AS t2
    INNER JOIN test1 AS t1a ON t1a.PRODUCT = t2.PRODUCT1 and t1a.PRODUCT like '%U'
    INNER JOIN  test1 AS t1b ON t1b.PRODUCT = t2.PRODUCT2 and t1b.PRODUCT like '%R' 
    and t1a.MSISDN = t1b.MSISDN 
    UNION 
    select DISTINCT a.MSISDN , b.* from test2 AS b
    INNER JOIN test1 AS t1a ON t1a.PRODUCT = b.PRODUCT1 and t1a.PRODUCT like '%U'
    INNER JOIN test1 AS a ON   b.PRODUCT2 =  
    CASE WHEN  NOT EXISTS
    (SELECT  t1aa.MSISDN, t22.*
    FROM test2 AS t22
    INNER JOIN test1 AS t1aa ON t1aa.PRODUCT = t22.PRODUCT1 and t1aa.PRODUCT like '%U'
    INNER JOIN  test1 AS t1bb ON t1bb.PRODUCT = t22.PRODUCT2 and t1bb.PRODUCT like '%R' 
    and t1aa.MSISDN = t1bb.MSISDN and t1aa.MSISDN = t1a.MSISDN)
    THEN '*' END and t1a.MSISDN = a.MSISDN
    la requette que j'ai fais est sous forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     requeteA UNION requeteB CASE NOT EXISTS requeteA
    je refais la requeteA deux fois , en fait la requeteB n'est fait que si la requete A ne retourne rien pour les meme MSISDN

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Vous mettez des restriction dans la jointure (t1a.PRODUCT LIKE '%U'). Ce n'est pas leur place. Les restriction doivent être dans les clauses WHERE !
    Utilisez UNION ALL de préférence quand c'est possible.
    factorisez vos requêtes à l'aide des CTE
    Utilisez COALESCE plutôt que case


    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
    WITH 
    T1 AS
    (
    SELECT t1a.MSISDN, t2.*
    FROM   test2 AS t2
           INNER JOIN test1 AS t1a 
                 ON t1a.PRODUCT = t2.PRODUCT1 
           INNER JOIN  test1 AS t1b 
                 ON t1b.PRODUCT = t2.PRODUCT2 
                    AND t1a.MSISDN = t1b.MSISDN 
    WHERE  t1a.PRODUCT LIKE '%U'
      AND  t1b.PRODUCT LIKE '%R' 
    ), 
    T2 AS
    (
    SELECT DISTINCT a.MSISDN , b.* 
    FROM   test2 AS b
           INNER JOIN test1 AS t1a 
                 ON t1a.PRODUCT = b.PRODUCT1 
           INNER JOIN test1 AS a 
                 ON b.PRODUCT2 = COALESCE((SELECT MSISDN 
                                           FROM   T1 
                                           WHERE T1.MSISDN = t1a.MSISDN), '*')
    WHERE t1a.PRODUCT LIKE '%U')
    SELECT * FROM T1
    UNION ALL
    SELECT * FROM T2;
    Apprenez le SQL... Mon site web, comme mon bouquin peuvent vous y aider !

    A +

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    J'ai même l'impression que vous pouvez vous passer de l'UNION, en faisant une jointure externe (pour t1b )

    Mais vous n'avez pas dit un mot sur le contexte et sur ce qu'en censée faire la requête. Rien sur la structure de vos table non plus...donc difficile d'en dire plus

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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