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 :

TOP et optimiseur


Sujet :

MS SQL Server

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 446
    Points
    1 446
    Par défaut TOP et optimiseur
    Bonjour,

    Considérant une table incluant les champs suivants :
    ID_DOC (int)
    TITRE_DOC (varchar)
    DTHR_DOC (datetime)
    En réalité la table comporte de nombreux autres champs, mais inintéressants au regard de ma question (au passage elle est trop grosse, donc consomme beaucoup trop d' i/o, un dégraissage s'impose).

    Admettons qu'un index cluster décroissant soit créé sur le champ DTHR_DOC.
    Que la table fasse environ 300 000 lignes.

    Je m'interroge sur la différences de performances quant aux 2 requêtes suivantes, dont les plans respectifs utilisent chacun l'index cluster.

    Requête 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM matable 
    WHERE predicats
    ORDER BY DTHR_DOC DESC    // usage de l'index cluster

    Requête 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 50 * FROM matable 
    WHERE predicats
    ORDER BY DTHR_DOC DESC    // usage de l'index cluster
    La requête 2 montre des performances excellentes comparées à la requête 1.
    Avec Management Studio cela peut se comprendre car la requête 1 doit ramener les 300 000 enregistrements.

    Mais cela se confirme au sein d'une application qui procède pourtant en 2 étapes :
    a) SQL Execute de la requête
    b) Fetch record x 50

    L'étape a) pourrait être aussi rapide pour les requêtes 1 et 2, car pour l'étape b) il suffirait à l'optimiseur de suivre l'index cluster dans l'ordre et d'isoler les enregistrements conformes aux prédicats du WHERE.

    Visiblement, l'optimiseur, dans le cas de la requête 1, préfère parcourir tous les enregistrements, même si au bout du compte on ne "Fetch" qu'un seul enregistrement.

    Vous allez me dire, c'est l'intérêt de la commande TOP.

    Ce qui est ennuyeux, c'est qu'elle n'est pas standard, et pour ceux qui utiliseraient un ORM quelconque (je ne suis pas fan...), il est probable que la commande TOP ne sera pas utilisée, au profit d'un Execute classique suivi du nb de fetchs nécessaires.

    Si vous avez des éléments complémentaires, ça m'intéresse

    Sylvain
    .NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

    Mon Blog : http://blog.developpez.com/index.php?blog=89
    Mes Articles : http://sjames.developpez.com/
    Rubrique XMLRAD: http://xmlrad.developpez.com

  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,

    Lorsque vous envoyez une requête depuis votre application, la requête est exécutée dans son intégralité, et le résultat est renvoyé au client. Ce que vous en faites ensuite dans votre application n'est plus du ressort du SGBD...

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 446
    Points
    1 446
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Lorsque vous envoyez une requête depuis votre application, la requête est exécutée dans son intégralité, et le résultat est renvoyé au client. Ce que vous en faites ensuite dans votre application n'est plus du ressort du SGBD...
    Ce n'est pas très juste, le résultat n'est pas systématiquement renvoyé au client. Il faut que celui-ci le sollicite par ce qu'on appelle communément des "fetch record".
    Ma question portait surtout sur le fait ou non que la requête soit exécutée en intégralité ou pas,
    en me basant sur l'idée que dans certains cas de figure (notamment en présence d'index cluster sur lequel est posé un ORDER BY), un SELECT * pourrait être exécuté comme un SELECT TOP x *

    Ce n'est pas le cas, mais ce n'est pas illogique.
    .NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

    Mon Blog : http://blog.developpez.com/index.php?blog=89
    Mes Articles : http://sjames.developpez.com/
    Rubrique XMLRAD: http://xmlrad.developpez.com

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    En fait aieaieaie a raison:
    La requête est exécutée dans son intégralité, mise en attente sur le réseau et consommée par votre DataReader (je suppose qu'il s'agit de lui...)
    Ce n'est pas parce que vous vous ne parcourez que les 50 premiers que SQL SERVER n'a pas renvoyé toute les lignes...

    Pour les ORM vous êtes dans le faux, ils sont justement là pour que vous ne vous posiez pas ce genre de question, chaque SGBD proposant sa propre implémentation du "TOP" l'ORM s'en servira (LINQ TO ENTITIES via take<50) génère un TOP 50...)
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 446
    Points
    1 446
    Par défaut
    Citation Envoyé par iberserk Voir le message
    La requête est exécutée dans son intégralité, mise en attente sur le réseau et consommée par votre DataReader (je suppose qu'il s'agit de lui...)
    En le formulant différemment je crois qu'on dit la même chose
    Un résultat de requête "en attente sur le réseau", peut-être, mais où précisément sur le réseau ? Le serveur SQL stocke les résultats côté serveur, et les diffuse via le réseau, à la demande du client.
    Dans mon cas, il ne s'agit pas d'un datareader (techno non microsoft) mais le principe de fonctionnement est le même.

    Ce n'est pas parce que vous vous ne parcourez que les 50 premiers que SQL SERVER n'a pas renvoyé toute les lignes...
    Je suis d'accord sur le calcul du résultat, mais par contre, un serveur SQL ne renvoie pas systématiquement toutes les lignes.

    Pour les ORM vous êtes dans le faux, ils sont justement là pour que vous ne vous posiez pas ce genre de question, chaque SGBD proposant sa propre implémentation du "TOP" l'ORM s'en servira (LINQ TO ENTITIES via take<50) génère un TOP 50...)
    Tant mieux alors, je pêche par pessimisme mais je te crois volontiers, effectivement c'est une bonne chose.
    Il faut préciser que tu cites une configuration idéale : un ORM microsoft haut de gamme générant du SQL pour LE SGBD Microsoft.
    Hibernate doit être dans le même cas de figure.
    Il serait intéressant de voir ce que génèrent des ORM moins connus, ceux que l'on peut trouver dans les frameworks Zend, Play, et autres Django
    .NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

    Mon Blog : http://blog.developpez.com/index.php?blog=89
    Mes Articles : http://sjames.developpez.com/
    Rubrique XMLRAD: http://xmlrad.developpez.com

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Pour la pagination Hibernate est catastrophique. Il fait une requête générant toutes les lignes à chaque page pour ne renvoyer que le lot concerné....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Mettez un profiler SQL et postez la requète générée...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. 9i / Optimiseurs CHOOSE et RULE
    Par Yorglaa dans le forum Administration
    Réponses: 5
    Dernier message: 26/05/2004, 10h41
  2. Question facile, erreur bizzare lors d'un Left, Top
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2004, 12h56
  3. Requetes TOP/BOTTOM
    Par bilbon.S dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/04/2004, 12h30
  4. MessageBox always on top
    Par Ingham dans le forum Composants VCL
    Réponses: 5
    Dernier message: 08/04/2004, 13h44
  5. ASM + DELPHI ... soucis ... mais top intéressant !
    Par - Robby - dans le forum Langage
    Réponses: 9
    Dernier message: 21/11/2003, 15h58

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