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

Développement SQL Server Discussion :

NOT IN or not NOT IN [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut NOT IN or not NOT IN
    Bonjour,

    J'ai trouvé élégant de faire cette requête d'insertion à partir de ce qui sera supprimé..
    Sauf que j'ai l'impression que la sous requête de la clause WHERE mange tout le bénéfice !
    D'où ma question : NOT IN or not NOT IN ? (vs NOT EXISTS), (ou plus malin encore )

    Qu'en pensez vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELETE
        CIDRE_RE7.dbo.VAnoprocess
    OUTPUT 
        DELETED.*
        INTO
        CIDRE_RE7_DW.dbo.VAnoprocess
    FROM
        CIDRE_RE7.dbo.VAnoprocess
    WHERE
        CIDRE_RE7.dbo.VAnoprocess.[OF8] + CIDRE_RE7.dbo.VAnoprocess.[OFI] NOT IN (SELECT DISTINCT [OF]+I FROM CIDRE_RE7.dbo.vpassage)
     
        PRINT 'VAnoprocess'

  2. #2
    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'en pense que si l'une de vos colonnes OF8, OFI, OF, I est nullable, alors vous allez avoir des surprises... est-ce le cas ?

    Qu'est que cette addition (concaténation ?)

    A prmière vue, un NOT EXISTS ou une jointure externe + test null semble plus approprié

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut
    Les colonnes OF8, OFI, OF, I font partis des primary key dés 2 côtés, donc pas de null possible.
    Oui, le "+" est une concaténation des 2 champs.

    Je pose cette question car ma sous requête contient environ 2030002 enregistrements (Vpassage), et la premiere 3459 (VAnoprocess).

    Et le temps de traitement est Exxxxtrêeeemmment long !

  4. #4
    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
    forcément, votre concaténation empêche l'utilisation des indexs.

    dans votre cas je pense qu'un NOT EXISTS sera plus performant

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut
    Ahhhh...!!!!

    Merci aieeeuuuuu

  6. #6
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Exact, il sera certainement plus performant de faire un NOT EXISTS avec pour condition tes deux champs dans le WHERE plutôt qu'une concaténation des deux. D'autant qu'avec un petit index tu devrais pouvoir gagner en perfs sur ta sous requête.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/04/2014, 12h16
  2. does not exist and was not trapped in __call()
    Par lordlifen dans le forum MVC
    Réponses: 4
    Dernier message: 25/05/2011, 11h55
  3. Réponses: 4
    Dernier message: 18/01/2006, 22h19
  4. Component not found
    Par Pm dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 15h40
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 01h07

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