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

Développement SQL Server Discussion :

Comparer les temps d’exécution d'une requête


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut Comparer les temps d’exécution d'une requête
    Bonjour à tous,

    Je souhaiterai pouvoir comparer le temps d’exécution d'une requête. Pour cela j'ai essayé de la répéter quelques centaines de fois dans mon SQL Server Management Studio.

    Pour information, je travail avec SQL SERVER 2008.

    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM T_PERSONNE
    GO
    SELECT * FROM T_PERSONNE
    GO
    ...
    Je divise ensuite le nombre de requête par le temps d'exécution pour obtenir le temps d'exécution moyen de ma requête.

    Hélas, entre deux test de ce - benchmark - (a prendre bien entre des pincettes), les temps moyens sont vraiment différents d'une exécution à l'autre, et cela m’empêche de comparer avec d'autres type de requête comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM, PRENOM, ADRESSE FROM T_PERSONNE
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM, PRENOM, ADRESSE FROM dbo.T_PERSONNE
    J'avais tenté de faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE @I INT 
    SET @I =1 
     
    WHILE @I < 300 
    BEGIN 
    	SELECT * FROM T_PERSONNE
    END
    Mais le delta entre deux exécutions sont toujours gênant pour bien se rendre compte de l'impact des différentes écritures possibles.

    Auriez-vous une idée d'une bonne façon de procéder ?

    Merci,
    Etanne

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Vu qu'un SGBD est loin d'être stupide (et SQL Server fait partie de l'élite des intelligents) tu peux exécuter 1 fois pour 10000000000000000000000 fois de suite la même requête, seul le temps de la première sera significatif.

    En effet, le moteur remarque immédiatement que c'est la même requête, et se contente de vérifier que les données n'ont pas changé depuis la dernière exécution... et il te renvoie le dernier résultat connu sans rejouer la requête...

  3. #3
    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 : 43
    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
    Par défaut
    En effet, le moteur remarque immédiatement que c'est la même requête, et se contente de vérifier que les données n'ont pas changé depuis la dernière exécution... et il te renvoie le dernier résultat connu sans rejouer la requête...
    ????

    Il est vrai qu'à la seconde exécution les données seront lue de la mémoire vive ce qui peut ne pas être la cas de la première...

    De plus le plan d’exécution est en cache SQL SERVER n'a donc pas à le recalculer d'où une seconde exécution plus rapide...

    Mais SQL SERVER refera tout de même la requète...

  4. #4
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Merci pour vos réponses.

    J'avais complètement oublié les caches... ...de plus mon test était fait en réseau.

    Bref, tout pour mettre en péril mon travail de recherche.

    Il y a t-il des outils ou méthodes pour pouvoir comparer différentes requêtes, et avoir réellement le temps de traitement du moteur MSSQL ?

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM dbo.T_BUREAU
    -- versus
    SELECT * FROM T_BUREAU
    Merci à tous ,
    Etanne

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Le plan d'exécution.

    Cependant, je ne vois pas quelle différence il peut y avoir entre les deux requêtes...

    La table t_bureau existe avec plusieurs propriétaires différents ???

  6. #6
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Je cite par exemple SQLPro :

    Ne pas utiliser les schémas en préfixe des objets est idiot, car cela posera des problèmes de performances : le SGBDR doit rechercher quel est le schéma à utiliser dans le contexte de lancement de la requête et cela peut varier d'un utilisateur à l'autre.

    http://www.developpez.net/forums/d10...r/#post5848634
    De ce que j'ai compris, il fallait préciser directement le schéma dans la requête.

    J'ai mal compris ?

    Merci !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Vu qu'un SGBD est loin d'être stupide (et SQL Server fait partie de l'élite des intelligents) tu peux exécuter 1 fois pour 10000000000000000000000 fois de suite la même requête, seul le temps de la première sera significatif.

    En effet, le moteur remarque immédiatement que c'est la même requête, et se contente de vérifier que les données n'ont pas changé depuis la dernière exécution... et il te renvoie le dernier résultat connu sans rejouer la requête...
    Non, cela est totalement faux. Sauf à utiliser SSAS et un cube OLAP.

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

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

Discussions similaires

  1. Comment récuperer les différentes lignes d'une requête ?
    Par frikazoide dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/01/2007, 08h33
  2. [SQL] compter les éléments distincts dans une requête
    Par redwire dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/10/2006, 17h44
  3. exclure les lignes blanches dans une requêtes
    Par sam01 dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/10/2006, 09h42
  4. [Sécurité] Sécurité portable pour les données utilisées dans une requête
    Par berceker united dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/07/2006, 14h48
  5. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02

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