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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 43
    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
    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 995
    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 995
    Billets dans le blog
    6
    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 : 43
    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
    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
    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 : 43
    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
    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 : 43
    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
    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 : 43
    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
    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 : 43
    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
    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 :



    @++

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

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