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 :

bug de sql server sur le top


Sujet :

MS SQL Server

  1. #1
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut bug de sql server sur le top
    bonjour à tous,

    peut-être ce problème est il célèbre, mais moi je découvre et je ne comprends pas ce qui se passe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT     TOP 7 *
    FROM         table1
    WHERE     (table1.count_prd <> 10) AND (NOT EXISTS
                              (SELECT     *
                                FROM          table2
                                WHERE      table2.id = table1.id)) AND (NOT EXISTS
                              (SELECT     *
                                FROM          table3
                                WHERE      table3.id = table1.id))
    cette requête marche très bien (exécutée en 2-3 secondes, et idem sans le top)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT     TOP 6 *
    FROM         table1
    WHERE     (table1.count_prd <> 10) AND (NOT EXISTS
                              (SELECT     *
                                FROM          table2
                                WHERE      table2.id = table1.id)) AND (NOT EXISTS
                              (SELECT     *
                                FROM          table3
                                WHERE      table3.id = table1.id))
    cette requête ne s'exécute pas, le délai d'attente expire alors que c'est rigoureusement la même que la précédente (avec un top inférieur à 6 , même problème)

    Une explication?

    Merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    C'est difficile à dire sans la structure de vos tables et le plan de requêtes, d'autant que vous utilisez des jointures triangulaires et des prédicats non-sargables ...

    @++

  3. #3
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    héhé, j'ai appris des choses moi aujourd'hui, merci pour les liens.

    Concernant la structure des tables :
    - trop compliqué à expliquer en 5 minutes j'essayerais de m'étendre plus après ce soir, j'aurais plus de temps.

    Concernant le plan de requêtes :
    - La je vois pas trop la notion de "plan" de requêtes, j'avoue...

    Concernant la requête elle même :
    - Après avoir lu les 2 liens, je ne vois pas trop comment me passer des prédicats non-sargables et je n'ai pas l'impression d'utiliser de requêtes triangulaires ( en tout cas pas de la forme présente dans le tuto., ma clause select est on ne peut plus simple )

    Dans tout les cas, je ne saisi pas en quoi la qualité de ma requête (probablement très perfectible) peut jouer sur une différence d'autant de temps entre 2 TOP différents de une unité ! ( si ça peut aider la requête renvoie une vingtaine de lignes sans le TOP )

    merci pour l'aide en tout cas

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    trop compliqué à expliquer en 5 minutes j'essayerais de m'étendre plus après ce soir, j'aurais plus de temps.
    Le DDL suffit à lui seul, vous pouvez le générer en cliquant droit sur la table puis en choisissant "Générer un script de la table en tant que ..."

    Pour obtenir le plan de requête, lorsque vous avez la requête et que les paramètres s'il y en a sont remplacés par des valeurs, appuyez sur CTRL+L ou encore sur l'icône "Afficher le plan d'exécution estimé" / "Inclure le plan d'exécution réel" (la plupart du temps vous obtiendrez le même plan, les deux se basent sur les estimations statistiques de sélectivité des colonnes).

    je n'ai pas l'impression d'utiliser de requêtes triangulaires
    Pourtant dans la définition de ce que c'est :

    les sous-requêtes qui la constituent spécifient des références en dehors d’elles-mêmes
    Et c'est le cas dans votre requête : vous référencez table1 dans vos sous-requêtes

    @++

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT TOP 6 mesColonnes
    FROM monSchema.table1 AS T1
    JOIN (
    			SELECT table1.ID
    		EXCEPT
    			(
    					SELECT ID
    					FROM monSchema.table2
    				UNION
    					SELECT ID
    					FROM monSchema.table3
    			)
    	) TMP ON TMP.ID = T1.ID
    @++

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par thelpi Voir le message
    bonjour à tous,
    Une explication?

    Merci d'avance.
    Y a encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TOP 7 * 
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.id = t2.id
    LEFT JOIN table3 t3 ON t1.id = t3.id
    WHERE t1.count_prd <> 10 
    	AND t2.id IS NULL
    	AND t3.id IS NULL

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    A voir en performances, surtout avec le *

    @++

Discussions similaires

  1. [Debutant] Connexion à un serveur SQL Server sur le reseau
    Par klael dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/02/2009, 03h07
  2. Liste des seveurs SQL SERVER sur le réseaux
    Par Amri_Daly dans le forum Windows
    Réponses: 1
    Dernier message: 18/11/2005, 11h21
  3. Connexion à SQL Server sur poste distant
    Par devine.ki.c dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/09/2005, 15h55
  4. sql server sur pocket pc
    Par largowinch dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/09/2005, 18h25
  5. Plantage SQL Server sur requete de mise a jour
    Par Laurent_75000 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/09/2005, 10h00

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