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 :

Estimated subtree cost et temps d'exécution


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 65
    Points
    65
    Par défaut Estimated subtree cost et temps d'exécution
    Bonjour,
    je travaille sur l'optimisation des requêtes sous SQL Server.
    Pour comparer 2 requêtes, j'utilise le plan d'exécution réel de SQL Server Management Studio et notamment le champs Estimated Subtree Cost qui doit être le plus faible possible.

    Voici les résultats obtenus pour l'exécution de 2 requêtes qui renvoient le même résultat :
    - Requête 1 > Subtree cost : 0.25, temps d'exécution : plus de 5 secondes
    - Requête 2 > Subtree cost : 0.52, temps d'exécution : moins de 1 seconde


    Ma question est donc de savoir quelle requête est effectivement la plus efficace?
    Est-ce que la requête 2 qui à un Subtree Cost faible n'aura pas un temps d'exécution beaucoup plus long sur une volumétrie plus importante?

    Merci pour vos infos et vos pistes.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    bonjour,
    pour pouvoir te répondre, il faudrait le ddl des tables et indexs (+ jeu d'essai) et les requêtes

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    Je ne suis pas expert, mais j'ai envie de dire que dans "Estimated Subtree Cost", il y a "Estimated". Ce qui veux bien dire que la donnée est une estimation et par conséquent peu fiable...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    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 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Le cout estimé sera parfaitement fiable si :
    1) la requête est purement ensembliste (donc aucun appel à des fonctions, même implicites)
    2) les statistiques sont à jour.

    A ces deux conditions, le cout estimé sera assez directement proportionnel au temps CPU (et non au temps d'exécution). En effet, passé un coût de 5 (paramétrable) l'optimiseur transforme le plan mono threadé en plan parallélisé (multi threadé) qui a la faculté de présenter en général un temps d'exécution moindre, mais un coût CPU comparable voir légèrement plus élevé.

    A +

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 65
    Points
    65
    Par défaut
    Merci pour vos réponses.
    Dans ce cas, devons nous purement et simplement comparer les performances de 2 requêtes sur leur seule durée d'exécution?
    Cette façon de faire me parait un peu simpliste. En effet, malgré un temps d'exécution plus rapide et un "Estimated Subtree Cost" (même peu fiable) élevé, ma requête n°2 ne risque-t-elle pas de devenir très lente lorsque je me trouverai dans une base avec un volume plus important de données?

  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 862
    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 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par moumoune65 Voir le message
    Merci pour vos réponses.
    Dans ce cas, devons nous purement et simplement comparer les performances de 2 requêtes sur leur seule durée d'exécution?
    Certainement pas, mais bien sur leur cout estimé. La durée d'exécution dépend du contexte... En effet si le serveur est très occupé, la processus intégrera des temps de chargement/déchargement plus important que sur un serveur identique servant de test.

    Cette façon de faire me parait un peu simpliste. En effet, malgré un temps d'exécution plus rapide et un "Estimated Subtree Cost" (même peu fiable) élevé, ma requête n°2 ne risque-t-elle pas de devenir très lente lorsque je me trouverai dans une base avec un volume plus important de données?
    Pas non plus. En effet, l'optimiseur peut décider de changer de plan de requête en fonction de la volumétrie des données, comme de la distribution des données...

    Par exemple dans cet article : http://blog.developpez.com/sqlpro/p9...alles_en_sql_1
    on voir clairement que le plan change en fonction de l'augmentation de volume des données a manipuler...
    Avec les requêtes 5 et 6 SQL Server passe de 297 (solution 5) ou 366 (solution 6) à 140 millisecondes alors que le volume des données augmente passant de 1000 à 3000...

    A +

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 65
    Points
    65
    Par défaut
    Merci pour ces remarques,
    mais j'ai encore une question concernant l'utilisation des fonctions.
    Ma requête 1, qui a un coût estimé faible, utilise des fonctions pour faire des jointures comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM MaTable1
    JOIN MaTable2 on MaTable2.Id = fonctionBidon(MaTable1.Id
    Est-ce que l'utilisation de telles fonctions dans une jointure est comprise dans l'estimation des coûts et est-ce une bonne idée (à mon avis pas vraiment)?
    Enfin, l'utilisation de fonctions dans la partie Select (ex : Select uneFonctionDagregation()) qui va faire un requête d'agrégation (comme un select sum() sur d'autres tables) est-elle performante?

  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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    st-ce que l'utilisation de telles fonctions dans une jointure est comprise dans l'estimation des coûts et est-ce une bonne idée (à mon avis pas vraiment)?
    Effectivement l'utilisation des fonctions scalaires et de table a plusieurs instructions ne permettant pas l'estimation des cardinalités, elles ne sont pas prises en compte dans l'estimation de coût. Seules les fonctions de table en ligne le sont.

    l'utilisation de fonctions dans la partie Select (ex : Select uneFonctionDagregation()) qui va faire un requête d'agrégation (comme un select sum() sur d'autres tables) est-elle performante?
    Oui, absolument. Encore faut-il qu'elles soient supportées par un index

    @++

  9. #9
    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 moumoune65 Voir le message

    Voici les résultats obtenus pour l'exécution de 2 requêtes qui renvoient le même résultat :
    - Requête 1 > Subtree cost : 0.25, temps d'exécution : plus de 5 secondes
    - Requête 2 > Subtree cost : 0.52, temps d'exécution : moins de 1 seconde
    Si les deux requêtes renvoient le même résultat, on peut raisonnablement penser qu'elle manipulent les même données. Il se peut alors que la première mette plus de temps à s’exécuter car elle doit lire les données sur le disque, et que la deuxième est plus rapide simplement parce que les données sont déjà en cache...

    vérifier les I/O de chaque requête peut être aussi un bon indicateur quant à leurs performances respectives.

Discussions similaires

  1. Comment estimer le temps d'exécution d'une tâche durant le traitement?
    Par Klemsy78 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 06/07/2014, 12h46
  2. [C#] Calcul du temps d'exécution.
    Par lozzko dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/06/2005, 16h12
  3. Réponses: 2
    Dernier message: 25/05/2004, 15h33
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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