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 :

Utilisation de NOT IN ? [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Décembre 2017
    Messages : 66
    Par défaut Utilisation de NOT IN ?
    Bonjour,

    J'ai une sous-requête dans ma requête avec l'utilisation de NOT IN mais les performances sont vraiment très mauvaises.... Auriez-vous une idée de comment faire pour ne pas utiliser NO IN svp et améliorer les performances ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT a.reference,
                    a.reference_id,
                    a.description,
                    a.annee
    FROM UneTable a
    WHERE a.reference_id NOT IN (SELECT b.reference_id
                                 FROM MaPremiereVue b)
    ORDER BY a.reference;

    Merci beaucoup à vous !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    S'il s'agit juste de ne pas utiliser NOT IN, tu peux utiliser NOT EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT
        ,   a.reference
        ,   a.reference_id
        ,   a.description
        ,   a.annee
    FROM    UneTable a
    WHERE   NOT EXISTS
            (   SELECT  NULL
                FROM    MaPremiereVue   b
                WHERE   b.reference_id  = a.reference_id
            )
    ORDER BY a.reference
    ;
    Toutefois il y a de fortes chances que cela ne change rien au plan d'exécution de la requête et donc à son temps de réponse.

    En revanche cela met en évidence la jointure qui est faite entre ces deux tables (vues ?) et la possibilité que l'ajout d'un index sur MaPremiereVue.reference_id améliore les accès.

    Si MaPremiereVue est une vue, c'est peut-être celle-ci qu'il faut améliorer.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Décembre 2017
    Messages : 66
    Par défaut
    Alors non, j'avais déjà essayé mais le "NOT EXISTS", ne fonctionne pas...
    Nom : 1.png
Affichages : 267
Taille : 1,1 Ko
    Nom : 2.png
Affichages : 301
Taille : 6,4 Ko

    Par contre, si effectivement je rajoute une jointure dans la sous-requête, le temps de réponse est instantanée !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT a.reference,
                    a.reference_id,
                    a.description,
                    a.annee
    FROM UneTable a
    WHERE a.reference_id NOT IN (SELECT b.reference_id
                                 FROM MaPremiereVue b
                                 WHERE a.reference_id = b.reference_id)
    ORDER BY a.reference;

    Merci beaucoup !
    Bonne journée

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 611
    Billets dans le blog
    10
    Par défaut
    Très étrange, car c'est bien documenté dans la doc 11g :
    https://docs.oracle.com/cd/B28359_01...htm#SQLRF52150

  5. #5
    Membre confirmé
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Décembre 2017
    Messages : 66
    Par défaut
    Oui très bizarre...
    Après je me demande si il ne faut pas l'utiliser dans une procédure et non pas dans une vue...

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 611
    Billets dans le blog
    10
    Par défaut
    non, dans une vue ou une table ça fonctionne tout à fait.

    Et je ne suis pas du même avis que AL1_24 au sujet des perfs, il est fréquent que (not) exists soit plus performant que (not) in , ça dépend du contexte et de l'optimiseur

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

Discussions similaires

  1. utilisation de "not exist"
    Par xirom dans le forum Requêtes
    Réponses: 11
    Dernier message: 26/09/2008, 09h06
  2. Utiliser Is Not Null , (VB6)
    Par libuma dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/03/2008, 17h27
  3. Utilisation du NOT IN
    Par JeremieT dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/07/2006, 08h34
  4. Utilisation du NOT IN
    Par aDamas dans le forum Débuter
    Réponses: 1
    Dernier message: 19/06/2006, 04h46
  5. [XSLT] Utilisation de "not"
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/05/2006, 11h11

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