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 d'une requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut Optimisation d'une requête
    Bonjour,
    J'aurai besoin d'aide pour l'optimisation d'une requête.

    Table A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IdA | IdB
    ---------
     1  | c2
     2  | c1
     3  | f3
     4  | c4
     5  | e4
     6  | c2
     7  | d4
    Table B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IdB | a | b 
    ------------
    c2  | 1 | 2
    c1  | 1 | 4
    f3  | 1 | 6
    c4  | 2 | 3
    e4  | 6 | 5
    c2  | 1 | 3
    d4  | 4 | 4
    Comme résultat je souhaiterai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IdA | IdB | a | b 
    ------------
     2  | c1  | 1 | 4
     4  | c4  | 2 | 3
    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM TableA A
     JOIN TableB B
     ON A.IdB = B.IdB
     AND IdB like 'c%'
     
    WHERE IdB not in (Select IdB
         FROM TableB
         WHERE a = '1'
         AND b in ('2','3','5'))
    Or je manipule des millions d'enregistrements et je souhaiterai optimiser tout cela.
    J'ai regardé le cours : http://sqlpro.developpez.com/cours/optimiser/#L9
    Et la règle 10 me montre bien comment optimiser le "not in" mais j'avoue ne pas bien saisir le "LEFT OUTER JOIN".
    Même après ce cours http://sqlpro.developpez.com/cours/s...ntures/#LIII-C j'ai quelques doutes quand à la construction de ma requête.
    En effet je bloque avec la condition "AND IdB like 'c%'", comment dois-je agencer tout ça ?

    Merci

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,


    Et plus simplement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM TableA A
     inner join JOIN TableB B ON A.IdB = B.IdB
    where b.IdB LIKE 'c%' and b.a <> 1 and b.b not in ('2','3','5')

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    peux-tu essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TableA A JOIN TableB B ON (A.IdB = B.IdB AND IdB LIKE 'c%' and a <> 1 and b not in ('2','3','5'))
    EDIT : Devancé again ...

  4. #4
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Merci pour vos réponses mais il me semble cette requête ne me renverrait rien pour mon jeu de test.
    En effet elle excluerait tous les a = 1 et les b = 2,3,5.
    Or je souhaite ici n'exclure que les couples (a,b) tels que (1,2), (1,3) et (1,5). D'où ma sous-requête.
    Je suis actuellement en chomage technique donc je ne peux pas tester

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Exact !
    Au temps pour moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TableA A JOIN TableB B ON (A.IdB = B.IdB AND IdB LIKE 'c%' AND (a <> 1 OR b NOT IN ('2','3','5'))

  6. #6
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Merci beaucoup.
    Comme une andouille j'avais pas pensé au "OR" dans le join !!
    J'attend de pouvoir tester avant de mettre résolu...

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Attention, les requêtes qu'on te propose ne donnent pas le même résultat que ta requête initiale :
    - Avec idb NOT IN (...), ça exclut tout les idb si un seul remplit la condition de ta sous-requête.
    - En remplaçant la sous-requête par des conditions directes sur tes lignes, tu n'exclut que les occurences de idb qui remplissent ces conditions.

    Côté performances, il faut le plan d'exécution avant tout, ainsi que les volumétries un peu plus précises genre combien de ligne c'est sensé te retourner.

    Quant aux cours d'optimisation de SQLPro, attention, ça dépend du contexte, du SGBD, ...
    La démarche pragmatique (du moins sur Oracle) c'est : lire le plan d'exécution, comprendre pourquoi c'est lent, imaginer comment ça pourrait l'être moins.

  8. #8
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Ah ben s'il y a une contrainte d'unicité sur IdB, elle a du sauter pour créer le jeu de test

    Citation Envoyé par lola06 Voir le message
    Table B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IdB | a | b 
    ------------
    c2  | 1 | 2
    c1  | 1 | 4
    f3  | 1 | 6
    c4  | 2 | 3
    e4  | 6 | 5
    c2  | 1 | 3
    d4  | 4 | 4

  9. #9
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Ah ben s'il y a une contrainte d'unicité sur IdB, elle a du sauter pour créer le jeu de test
    Judicieuse remarque !

  10. #10
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Désolée pour le retard mais impossible de répondre à cette conversation. Pourquoi ? --> le mystère reste entier !!!

    Citation Envoyé par punkoff Voir le message
    installez une version express (XE) oracle sur votre poste ..
    Malheureusement je ne peux pas faire ce que je veux sur mon poste

    Citation Envoyé par pacmann Voir le message
    Et sinon oui, c'est équivalent
    Mais franchement, sauf si tu n'as rien d'autre à faire, essayer toutes les combinaisons de transformation de SQLPro n'est qu'une perte de temps à mon sens...
    En fait c'est une demande afin que ce soit plus compréhensible. Mais rassure toi je ne vais pas faire toutes les combinaisons de SQLPro.
    J'attend d'avoir de nouveau mes bases de recettes pour lancer l'explain plan, d'ici là...

    Citation Envoyé par Rei Ichido Voir le message
    C'est tout à fait vrai, mais si idb est un identifiant unique (ce que son nom suggère un peu, mais soyons prudents) cela redevient équivalent Auquel cas on aurait tort de se priver de cette information !
    Citation Envoyé par pacmann Voir le message
    Ah ben s'il y a une contrainte d'unicité sur IdB, elle a du sauter pour créer le jeu de test
    Effectivement IdB est un identifiant unique, j'ai remarqué ma première erreur et comme vous pouvez le constater elle n’apparaît plus dans mon 2ieme jeu de test .

    Citation Envoyé par lola06 Voir le message
    Jeu de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     IdB | a | b 
    -------------
     c2  | 1 | 2
     c1  | 1 | 4
     f3  | 1 | 6
     c4  | 2 | 3
     e4  | 6 | 5
     c5  | 1 | 4
     d4  | 4 | 4

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

Discussions similaires

  1. Optimisation d'une requête
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/12/2005, 18h21
  2. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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