Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 03/01/2012, 10h54   #1
Invité de passage
 
Homme Nicolas FELTEN
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Nicolas FELTEN
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Par défaut Perte de performances

Bonjour,

J'interviens sur une base de données pour laquelle une SP me pose des problèmes. J'ai optimisé les index pour celle ci et donc réduit son temps d'exécution, l'utilisation CPU et les lectures. J'obtiens un temps d'exécution d'environ 300ms avec 60 000 lectures.
Lorsque cette sp est exécuté lors de tests nominaux, certains appels dépassent les 4s avec 500 000 lectures.
Il semble que certains appels n'utilisent pas les index. Lorsque je reprends la requête à partir du profiler et que je l'exécute à nouveau, je redescends à 300ms et 60 000 lectures.
Database Engine Tuning Advisor ne me donne pas d'améliorations, lorsque je l'exécute à partir des traces des tests nominaux.
J'ai ajouté la commande SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED dans la SP, mais cela n'a rien changé.

Quelqu'un aurait'il une piste qui expliquerait pourquoi certaines exécutions ne sont pas optimisées ?
Nicof28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 13h19   #2
Invité de passage
 
Homme Nicolas FELTEN
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Nicolas FELTEN
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Precision supplémentaire, le temps d'exécution et le nombre de lectures augmente lorsqu'il y a plusieurs appels simultanés.
Nicof28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 16h25   #3
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 751
Points : 751
C'est peut-être du au lock escalation.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 17h09   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 670
Points : 8 732
Points : 8 732
Bonjour,

Il s'agit peut-être d'un problème de "reniflage" de la valeur des paramètres à la compilation : le plan d’exécution est compilé avec des valeurs qui vont très bien pour la majorité des appels, mais peut devenir catastrophique pour certaines valeurs particulières.

Difficile de vous aider sans au moins le plan d'exécution réel de la requête lorsqu'elle s'exécute correctement, et quand elle devient contre-performante.

Vous pouvez traquer cela avec SQL Profiler, côté serveur.

Est-ce que les statistiques sont maintenues sur la table ?
Quel est le nombre de lignes de la table ?
Cette table supporte-t-elle de nombreuses modifications ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 18h19   #5
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
Donnez nous le code de cette procédure, mais je parie qu'il y a un curseur dedans....

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 03/01/2012, 19h09   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
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 725
Points : 6 849
Points : 6 849
Je pencherai plus pour un problème de parameter-sniffing comme Elsuket. Le plan d'exécution en cache n'est pas optimale pour le domaine de valeurs utilisé par la procédure stockée. A voir aussi du côté des statistiques, du taux d'échantillonnage etc ...

Il faudrait avoir plus d'éléments en effet comme le code de la procédure et les plans d'exécutions pour comparer ...

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 15h32   #7
Invité de passage
 
Homme Nicolas FELTEN
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Nicolas FELTEN
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Merci pour vos réponses.

Je ne peux pas vous donner le code car la personne qui l'a développée a eu la bonne idée de faire une SP de 1500 lignes !
Par rapport à son contenu, elle a un paramètre xml en entrée qui va définir son comportement, elle crée au moins une vingtaine de tables temporaires (tables temporaires et tables dans des variables), et le tout bien sûr en dynamique.
En fonction des données en entrée, elle va exécuter des requêtes différentes. Et oui il y a aussi un curseur à l'intérieur.
Il y a bien des lock escalation lorsqu'il n'y a pas le paramètre READ UNCOMMITTED.
Cette SP est un concentré des bad practices :-)


Si j'ai bien compris ce que vous m'avez répondu, c'est que le plan d'exécution créé par une des exécutions perturbe les autres exécutions qui ont besoin d'un plan d'exec différent.
Nicof28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 16h43   #8
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 751
Points : 751
Citation:
Envoyé par Nicof28 Voir le message
Il y a bien des lock escalation lorsqu'il n'y a pas le paramètre READ UNCOMMITTED.
Je lis entre les lignes qu'il n'y en aurait pas lorsque la transaction est READ UNCOMMITTED (j'avais bien un doute sur le sujet).

Si tu décèles que certains des query plus que d'autres au sein de la procédure peuvent avoir des performances trop inconsistantes, tu peux tenter l'option "OPTION (RECOMPILE)" avec ceux-ci.
Mal(heureusement) SQL Server prépare les plans d’exécution de tous les query d'un même batch avant de les exécuter plutôt que un par un avec leurs exécutions respectives qui peuvent fortement changer les statistiques qui dirigent la préparation des plans.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 12h01   #9
Invité de passage
 
Homme Nicolas FELTEN
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Nicolas FELTEN
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Merci pour l'info,

Je viens de faire un test avec l'option Recompile et je n'ai pas de gain lorsque j'en lance 4 en parallèle.

Je pense qu'il n'y a pas grand chose à faire étant donné qu'il y a beaucoup trop de traitements dynamiques qui ammènent à une multitude de possibilités de requêtes qui se font principalement sur des tables temporaires.

Je pense que je vais devoir la reprendre complètement.
Si quelqu'un a une idée miracle, je suis toujours preneur
Nicof28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h23   #10
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
1) supprimer le XML et passer tous les paramètres dans une table en dur
2) supprimer les tables temporaires autant que faire se peut
3) éradiquer le curseur, qui oui, fait une escalade de verrous
4) le SQL dynamique n'est pas un problème
5) ne jamais oublier de préfixer TOUS LES OBJETS par leur schéma SQL, même s'il n'y en a qu'un et que c'est dbo.

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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h52.


 
 
 
 
Partenaires

Hébergement Web