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 :

Temps d'exécution d'une requête variable suivant le contexte utilisé


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 6
    Par défaut Temps d'exécution d'une requête variable suivant le contexte utilisé
    Bonjour,

    J'ai le problème suivant :

    Sur un serveur SQL2005, comportant environ 20 bases de données, j'exécute une requête et les temps de réponse de la requête sont très différents (10s vs plusieurs minutes) suivant le contexte dans lequel je me situe(USE nomdedb),

    Les chemin d'accès sont différents : Hash Match (réponse 7s) et Inner Join (réponse plusieurs minutes).

    Le contexte posant problème est celui qui héberge les tables de la requête.

    Merci pour votre aide

  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
    Par défaut
    Bonjour,

    S'agit-ils exactement de la même requête ? (est-ce que vous nommez vos noms de table en trois ou quatre partie, c'est à dire avec le nom de la base ?)

    En lançant dans des contextes différents, vous générez à chaque fois une nouvelle compilation d'un plan d'éxécution. Vous pouvez (et visiblement c'est le cas) avoir deux plans différents.

    Êtes-vous sur un serveur de test ? Si c'est le cas, vous pouvez ajouter OPTION(RECOMPILE) à la fin de la requête afin de forcer une recompilation de la requête et voir si le résultat est meilleur.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 6
    Par défaut
    Merci beaucoup pour votre réponse : Le paramètre OPTION(RECOMPILE) résout bien le problème de cette requête.

    Mais je ne peux modifier ces requêtes en environnement de Production.

    Ainsi, comment puis je faire pour être sûr d'utiliser les meilleurs chemins d'accès, notamment en cas de modifications (ajout d'index dans mon exemple)? un DBCC FREEPROCCAHE régulièrement ? un arrêt/relance du serveur réinitialise t il tout? Autres?

    (En réponse à vos questions : les noms de tables sont préfixés par le nom de la DB et les requêtes sont vraiment identiques (copie/coller dans le gestionnaire de requête)).

    Merci

  4. #4
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 6
    Par défaut
    Bonjour,

    en comparant le paramétrage des bases, j'ai vu une différence dans le paramètre 'PARAMETERIZATION '

    Dans le contexte DB où j'ai PARAMETERIZATION SIMPLE, le chemin d'accès est bon.
    Dans le contexte DB où j'ai PARAMETERIZATION FORCED, le chemin d’accès est défaillant.

    J'ai modifié ce paramètre (ALTER DATABASE BINFP SET PARAMETERIZATION SIMPLE) et, effectivement, la requête s'est déroulée instantanément.

    Il ne me reste plus qu'à analyser l'impact de ce paramètre (impact que j'espère négatif) pour le reste des requêtes sur cette DB.

    Merci beaucoup pour votre aide

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Hello,

    L'avantage de cette option est de forcer SQL Server à "paramétriser" les plans d'exécutions pour qu'ils puissent être ultérieurement réutilisés mais cela peut également devenir un problème si le plan d'exécution généré n'est optimisé que pour un sous ensemble de valeurs de paramètres correspondants (SQL Server sniffe les valeurs de paramètres pour compiler le plan d'exécution).

    Le fait de supprimer cette option de base de données peut améliorer ta requête mais peut aussi avoir un effet négatif comme tu le cites sur les autres requêtes et sur la taille du cache dédié à cela (compiled plan / adhoc).

    ++

  6. #6
    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
    Il y a aussi d'autre options.
    Par exemple
    - Il est envisageable de laisser le hint OPTION (RECOMPILE) pour cette requête spécifiquement, surtout si son cout de compilation est faible...
    - En fonction de la façon dont la requête est/sera appelée, il est aussi possible d'utiliser OPTIMZE FORliste non exhaustive !

    Est-il possible de voir la requête en question ?
    Et un peu de détail sur le contexte, la volumétrie, ...

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2007, 12h10
  2. [MySQL] temps d'ouverture d'une connexion VS temps d'exécution d'une requête
    Par epoz dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/04/2007, 18h06
  3. Calculer le temps d'exécution d'une requête
    Par BRAUKRIS dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/03/2007, 12h59
  4. [MySQL] Temps d'exécution d'une requête
    Par eon-of-the-scorn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/07/2006, 11h06
  5. 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

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