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 :

Problème TOP 1 [2008R2]


Sujet :

MS SQL Server

  1. #1
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut Problème TOP 1
    Bonjour,
    VOici le problème rencontré aujourd'hui:

    Soit la requête suivante:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT top 1 monChamp,monchamp2 from maVue where maFK = 10 and maFK2 = 12 order by maPkey desc

    Si on enlève le order by ou le top, la requête est quasi instantanée.

    En cherchant un peu, on est tombé sur cet article:
    http://www.mssqltips.com/sqlserverti...in-sql-server/

    Et en modifiant ainsi la requête, elle devient instantannée :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @i INT
    SET @i=1
    SELECT top(@i) monChamp,monchamp2 from maVue where maFK = 10 and maFK2 = 12 order by maPkey desc


    Des commentaires ?, des astuces à partager sur le sujet ?
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Le problème du TOP a été abordé maintes fois. Ce n'est pas une opération relationnelle et par conséquent ses performances dépendant grandement de paramètres physiques différents ainsi que de statistiques et d'indexation...

    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/ * * * * *

  3. #3
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Relisez mieux mon post:
    Pourquoi
    Est plus lent que
    (Avec @i égal à 1)
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  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
    Bonjour,

    Citation Envoyé par imikado Voir le message
    Et en modifiant ainsi la requête, elle devient instantannée :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @i INT
    SET @i=1
    SELECT top(@i) 1 monChamp,monchamp2 from maVue where maFK = 10 and maFK2 = 12 order by maPkey desc
    Est-ce que le 1 après le TOP(@i) est une erreur de copier/coller ???
    Sinon, ça peut expliquer la rapidité : la requête n'est plus la même, elle ne remonte plus le contenu de la colonne "monChamp", et peut éventuellement profiter d'un index couvrant, ou autre...

    Avez-vous comparé les plans d’exécution des deux requêtes ?

  5. #5
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Oui c'est une erreur de copier coller (j'ai corrigé dans le post d'origine)

    L'idée c'est la différence entre le TOP 1 vs le TOP @i (avec @i égal à 1)

    Non je n'ai pas regardé le plan d'éxécution, mais l'article cité est intéressant à lire
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  6. #6
    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,

    Ici je pense qu'il s'agit d'un petit problème d'estimation de cardinalités / reniflage de paramètres : il faudrait étudier le plan d'exécution pour s'en convaincre.

    Lorsque le code est TOP 1, SQL Server réalise une estimation de cardinalité, et utilise en conséquence et par exemple, un index qui ne couvre pas la requête, et qui produit bien plus de key lookups qu'escompté, soit du fait d'une répartition inégale des cardinalités dans la plage de valeurs de maFK et maFK2.

    En revanche en paramétrant la requête comme vous le faites avec une variable locale, on outrepasse l'estimation de cardinalités, ce qui fait que SQL Server utilise des règles d'estimation de cardinalités par défaut qui produisent un plan de requête plus efficace, par exemple qui utilise une index cluster qui couvre bien la requête.

    Il serait intéressant de savoir également si vous avez un index sur les colonnes maFK et maFK2, si elles appartiennent à la même table, et si ledit index contient les colonnes monChamp et monChamp2. L'histogramme de la statistique sous-jacente sera également utile.

    Il vous est donc nécessaire de collecter les deux plans réels d'exécution, et de les comparer pour voir où se situe la différence.
    Une telle comparaison est facilitée par l'outil SQL Sentry Plan Explorer

  7. #7
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Voila les 2 plans d'executions
    Images attachées Images attachées   
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  8. #8
    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
    Merci. Malheureusement cela est insuffisant puisque les cardinalités ne sont pas exposées.

    Le mieux est d'utiliser SQL Sentry Plan Explorer, qui comprend une fonctionnalité d'anonymisation de fichiers de plan d'exécution, et de mettre ces fichiers (pas les capture d'écran) en pièce attachée. Voici ce que l'on obtient par exemple :



    @++

  9. #9
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Je regarde, en passant sympa l'article
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  10. #10
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Voici les deux fichiers + les images:
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  11. #11
    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
    C'est dommage, vous ne donnez pas le plan d'exécution réel : pour l'obtenir il faut faire CTRL + M ou bien cliquer sur l'icône suivante dans SQL Server Management Studio :



    Le plan d'exécution réel permet de déceler la différence entre le nombre de lignes estimé à partir des statistiques de colonnes et le nombre réel de lignes récupérées.

    Cela étant, même avec le plan d'exécution estimé, on voit clairement que les cardinalités à la racine du plan, ainsi que l'ordre et les algorithmes d'accès aux tables sont nettement différents :



    Vous pouvez obtenir un seul fichier de plan d'exécution pour les deux requêtes : il vous suffit pour cela de la exécuter dans la même fenêtre de requête, en intercalant un GO entre les deux pour qu'il n'y ait pas "d'interférences" entre les deux requêtes au niveau des variables.

    Merci pour l'article; si vous souhaitez aller plus loin, je vous conseille de lire les deux ouvrages que je référence dans ce billet.

    Enfin si vous en avez le temps, venez aux Journées SQL Server : c'est la 3e édition du plus gros événement dédié à SQL Server en France, qui se déroulera les 2 et 3 décembre.

    Dans l'attente des plans d'exécution réels,

    @++

  12. #12
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Je ne peux pas faire " ctrl + M " j'ai la version gratuite et non la payante
    Images attachées Images attachées  
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  13. #13
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Avec l'option cochée (j'avais mal lu)
    Fichiers attachés Fichiers attachés
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  14. #14
    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
    Ha, les deux plans sont toujours des plans estimés.

    Il vous faut faire CTRL + M dans SQL Server Management Studio avant d'exécuter les requêtes. Une fois qu'elles sont exécutées, un 3e onglet va apparaitre dans le panneau de résultats, après celui pour le résultat et celui pour les messages : c'est ce plan qu'il nous faut

    @++

  15. #15
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Mais j'execute toujours dans votre logiciel ou dans le client sql "normal" ?
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  16. #16
    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
    Héhé, c'est ce que je pensais : désolé pour le manque de précision

    Donc vous devez :

    1. faire CTRL + M (ou cliquer sur l'icône que je vous ai indiqué plus haut) dans SQL Server Management Studio
    2. Exécuter la requête, toujours dans SQL Server Management Studio
    3. A la fin de l'exécution de la requête, un onglet Plan d'exécution va s'afficher : si vous avez le plugin SQL Server Management Studio de SQL Sentry, il vous suffit de faire un clic-droit dans une zone vierge du plan de requête pour voir celui-ci exposé dans SQL Sentry Plan Explorer. De là, vous pouvez l'enregistrer comme fichier tout en observant les cardinalités


    @++

  17. #17
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Ok, merci je regarderais demain pour installer le plugin
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  18. #18
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Ci-joint comme demandé

    Merci encore de votre aide.
    Fichiers attachés Fichiers attachés
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  19. #19
    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
    Étonnamment les deux fichiers font la même taille. Je viens de les comparer avec Beyond Compare, et ils sont identiques

    Dans l'attente de ces plans

    @++

  20. #20
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Points : 19 100
    Points
    19 100
    Billets dans le blog
    17
    Par défaut
    Je referais une génération la semaine prochaine, j'ai du me tromper à la génération.

    Question: ces résultats permettront d'expliquer pourquoi le plan d'execution diffère entre un TOP 1 et un TOP @i (@i=1 également) ?
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème TOP SQL Server 2000
    Par mino26tz dans le forum MS SQL Server
    Réponses: 29
    Dernier message: 21/12/2010, 04h53
  2. [AC-2003] Problème TOP et ORDER BY
    Par Nheil dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 21/04/2010, 08h40
  3. Réponses: 4
    Dernier message: 28/06/2007, 08h49
  4. Problème avec top
    Par byloute dans le forum Debian
    Réponses: 3
    Dernier message: 05/01/2007, 14h52
  5. Problème avec select top
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 10/12/2004, 14h55

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