Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Administration
Administration Forum d'entraide sur l'administration du dataserver, via SSM ou ligne de commande, les tables système, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 16h47   #1
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 18h34   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 18h19   #3
Membre chevronné
 
David BAFFALEUF
Inscription : février 2008
Messages : 612
Détails du profil
Informations personnelles :
Nom : David BAFFALEUF
Localisation : France

Informations forums :
Inscription : février 2008
Messages : 612
Points : 746
Points : 746
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.
__________________
David B.
dbaffaleuf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 13h11   #4
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 20h25   #5
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Citation:
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.

Citation:
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.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 10h34   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 13h42   #7
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h08.


 
 
 
 
Partenaires

Hébergement Web