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

Administration SQL Server Discussion :

MSSQL 2008 R1 - Pb plan d'execution Proceddure


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Par défaut MSSQL 2008 R1 - Pb plan d'execution Proceddure
    Bonjour

    J'ai une procédure avec plusieurs paramètres; ceux-ci sont utilisés dans la clause 'where' d'une requête en 'select'.

    Quand je lance la procédure, elle a un plan tout pourri et dure longtemps
    Lorsque je lance la requête 'select' directement en initialisant les variables, la requête tourne rapidement et prend un plan correct

    En lançant des statistiques sur une des tables de la requête, cela a résolu le problème. Cette table contient une colonne date utilisée dans un des 'search argument' de la requête avec la date du jour passé en paramètre de la proc.

    Donc avant que je lance les stats, l'histogramme de cette colonne date n'avait pas de ligne en date du jour.

    J'ai l'impression que l'optimiseur se comporte différemment quand on lance un procédure et le select mais en mode ligne de commande


    J'espère que c'est assez clair. Si je dois développer certains points, n'hésitez pas à me le dire

    Jeeps64

  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
    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
    Et oui... Généralement l'utilisation d'une requête complexe générée en dynamique n'est pas génial, sauf à utiliser certains trucs...
    1) sp_executeSQL si possible et non EXEC ('...')
    2) préparer le maximum de données dans des variables locales
    3) spécifier les préfixes de schéma (dbo si vous n'en avez aucun autre) à tous les objets (tables, vues, procédures...)
    4) créer les index adéquats (et pas seulement les statistiques) sur les colonnes les plus fréquemment recherchés (à lire sur le sujet : http://sqlpro.developpez.com/cours/quoi-indexer/)

    Et si tout cela ne suffit pas, lire l'excellent article de Erland Sommarskog
    http://blog.developpez.com/sqlpro/p9...s-de-requetes/

    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
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Citation Envoyé par jeeps64 Voir le message
    J'ai l'impression que l'optimiseur se comporte différemment quand on lance un procédure et le select mais en mode ligne de commande
    Jeeps64
    La plan de la proc est toujours réutilisé sauf cas d'invalidation de plan, et la mise à jour des stats en constitue un. Exécuter la requête en ad hoc permet certes d'obtenir un plan tout neuf, mais force une recompilation systématique dans la plupart des cas.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Par défaut
    Bonjour

    La procédure prend le bon plan si je redéclare les variables à l'intérieur de la procédure
    Une 2ème possibilité est de recalculer les statisiques

    Je vais voir à implémenter un job de stats après alimentation de la table posant problème.

    Merci de vos conseils

    Jeeps64

  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
    La procédure prend le bon plan si je redéclare les variables à l'intérieur de la procédure
    Vous êtes sur un problème typique du parameter sniffing.
    En affectant vos variables en interne à la procédure, vous forcez l'optimiseur à ne pas se baser sur les statistiques liés à l'exécution d'une valeur mais bien celles liés aux objets sous jacents à la procédure.

    Une 2ème possibilité est de recalculer les statisiques
    Oui mais attention ... car vous allez forcement entrainer des recompilations de votre procédure. A voir donc si le jeu en vaut la chandelle. Regardez si votre première solution vous donne un résultat satisfaisant dans le temps.

    ++

  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
    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 jeeps64 Voir le message
    Je vais voir à implémenter un job de stats après alimentation de la table posant problème.
    Mieux vaut dans ce cas désactiver les index avant insertion et les reconstruire après. Cela recalcule les stats.

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

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Par défaut
    Bonjour

    Merci de vos divers retour
    Nous avons mis en place les stats après insertion (en fin de batch de nuit).
    Il ne s'agit pas de tables volumineuses et donc l'update stats est rapide

    A la première exécution, il recompile le plan ( mais le bon cette fois ci)

    Merci encore

    Jeeps64

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/06/2011, 10h47
  2. Bind variables et plan d'execution
    Par Wurlitzer dans le forum Oracle
    Réponses: 6
    Dernier message: 26/02/2007, 14h04
  3. [Oracle 10.2] Plan d'execution fonction PL/SQL
    Par pegase06 dans le forum PL/SQL
    Réponses: 6
    Dernier message: 13/02/2007, 12h02
  4. Plans d'execution differents
    Par jajaCode dans le forum Oracle
    Réponses: 13
    Dernier message: 14/12/2006, 12h29
  5. plan d'execution
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/03/2006, 10h40

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