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

MS SQL Server Discussion :

probleme avec une simple requetes


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 36
    Points
    36
    Par défaut probleme avec une simple requetes
    bonjour
    j'ai cette requetes ,


    en effet qand je la lance en entier elle ne s'arrete pas , je suis obligé de l'arreté au bout de 4h

    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
    select distinct 
    T1.Col1
    , T2.Col2
    , T2.Col3
    , T2.Col4
     
    from 		BASE1..Table1 T1 WITH (TABLOCK)
    inner join 	BASE2..Table2 T2 WITH (TABLOCK)
    ON		(T1.Col1 = T2.Col1 AND T1.Col5 = 500)
    where  T1.Col1  not in 
                    (select distinct L.Num1 
    		from (select C1 as Num1, Dat as Col1, count(C1)as count1
    		from BASE2..Table2
    		group by C1, Dat, MO
    		having count(C1)>1)as L)
    et quand je la coupe en deux morceau juste pour tester cad :
    requete 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct 
    XO.Col1
    , ROR.Col2
    , ROR.Col3
    , ROR.Col4
     
    from 		BASE1..Table1 T1 WITH (TABLOCK)
    inner join 	BASE2..Table2 T2 WITH (TABLOCK)
    ON		(T1.Col1 = T2.Col1 AND T1.Col5 = 500)
    elle met 1 minute pour donner le resultat

    requete2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     select distinct L.Num1 
    		from (select C1 as Num1, Dat as Col1, count(C1)as count1
    		from BASE2..Table2
    		group by C1, Dat, MO
    		having count(C1)>1)as L
    elle met 30 second pour donner le resultat

    je ne comprend pas pourquoi ?? si quelqu'un a une idee , merci de ma la communiquer

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Salut Babylonne,

    je te conseille de passer par des tables tempo, ce sera bcp plus simple et ta requête sera bcp plus lisible.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    un NOT IN implique un scan complet du jeu de résultat retourné par la sous-requête (puisqu'il faut être sûr qu'aucun enregistrement n'est qualifié). Il faut éviter les NOT IN autant que possible et passer par des tables intermédiaires. Le NOT IN concerne tous les SGBD.

    Pour la partie coupée en deux, regarde s'il n'y a pas un index manquant

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Et pour quoi utilises-tu des tablock ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Points : 36
    Points
    36
    Par défaut
    bonjour

    en fait parce que normalement avec les resulat je fait un insert (j'ai pas donnée toute la requetes).

    mais bien evidement le probleme je l'ai en faisant un simple select et meme en enlevant tablock.

    ce que je cherche a soir est pourquoi j'ai ce genre de phénomenes que je n'arrive pas a comprendre.
    merci d'avance pour votre aide

  6. #6
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    Citation Envoyé par Babylonne
    bonjour
    j'ai cette requetes ,


    en effet qand je la lance en entier elle ne s'arrete pas , je suis obligé de l'arreté au bout de 4h

    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
    select distinct 
    T1.Col1
    , T2.Col2
    , T2.Col3
    , T2.Col4
     
    from         BASE1..Table1 T1 WITH (TABLOCK)
    inner join     BASE2..Table2 T2 WITH (TABLOCK)
    ON        (T1.Col1 = T2.Col1 AND T1.Col5 = 500)
    where  T1.Col1  not in 
                    (select distinct L.Num1 
            from (select C1 as Num1, Dat as Col1, count(C1)as count1
            from BASE2..Table2
            group by C1, Dat, MO
            having count(C1)>1)as L)
    et quand je la coupe en deux morceau juste pour tester cad :
    requete 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct 
    XO.Col1
    , ROR.Col2
    , ROR.Col3
    , ROR.Col4
     
    from         BASE1..Table1 T1 WITH (TABLOCK)
    inner join     BASE2..Table2 T2 WITH (TABLOCK)
    ON        (T1.Col1 = T2.Col1 AND T1.Col5 = 500)
    elle met 1 minute pour donner le resultat

    requete2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     select distinct L.Num1 
            from (select C1 as Num1, Dat as Col1, count(C1)as count1
            from BASE2..Table2
            group by C1, Dat, MO
            having count(C1)>1)as L
    elle met 30 second pour donner le resultat

    je ne comprend pas pourquoi ?? si quelqu'un a une idee , merci de ma la communiquer
    Fais gaffe au NOT IN ça prend beacoup de temps pour s'exécuter,
    essaie un truc de type:



    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
     
    select distinct 
    T1.Col1
    , T2.Col2
    , T2.Col3
    , T2.Col4
     
    from         BASE1..Table1 T1 WITH (TABLOCK)
    inner join     BASE2..Table2 T2 WITH (TABLOCK)
    ON        (T1.Col1 = T2.Col1 AND T1.Col5 = 500)
    LEFT OUTER JOIN 
     
            (select C1 as Num1, Dat as Col1, count(C1)as count1
            from BASE2..Table2
            group by C1, Dat, MO
            having count(C1)>1)as L
    ON T1.Col1 = L.Num1
    WHERE L.Num1 IS NULL

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 936
    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 936
    Points : 51 753
    Points
    51 753
    Billets dans le blog
    6
    Par défaut
    C'est normal qu'elle ne s'arrête jamais et ne s'arrêtera jamais. En effet vous faites un verouillage explicite de la table2 entière (TABLOCK) dans la requête externe. Cette table n'est donc pas disponible pour la sous requête qui attend indéfiniement la libération du verrou....

    Ce n'est pas le problème du NOT IN, mais bien la façon absurde avec laquelle vous gérez les verrous pour vous assurer, à tort, que tout va bien se passer. Si vous utilisez une table temporaire le résultat risque d'être incohérent à cause des problèmes liés à la concurrence et il sera de toute façon moins performant.

    Postez votre requête entière, c'est à dire avec l'INSERT afin que nous puissions vous donner la solution.

    De toute façon gérer les verrous à la main est hautement dangereux, à moins que vous ne soyez un pro de la gestion des anomalies transactionnelles et que vous ayez pris soin de faire un graphe de verrouillage afin de savoir exactement ce que vous faites. Ce graphe aurait d'ailleurs mis en évidence l'absurde façon que vous avez de verrouiller !

    En principe avant de poser des verrous on essaye de traiter le problème à l'aide du paramétrage des niveaux d'isolation (SET TRANSACTION ISOLATION LEVEL ...)

    A +

Discussions similaires

  1. probleme avec une simple fonction
    Par francky57 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/10/2008, 12h01
  2. [Access] problème avec une sous-requête
    Par dirtyjs dans le forum Langage SQL
    Réponses: 12
    Dernier message: 09/11/2006, 23h26
  3. [Access] probleme avec une sous-requête synchronisée
    Par dirtyjs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2006, 17h44
  4. probleme avec une simple requete
    Par nassimmm dans le forum Langage SQL
    Réponses: 11
    Dernier message: 03/08/2006, 18h46
  5. Ksh, problème avec une simple boucle for
    Par herzleid dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2006, 15h45

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