Bonjour,
J'ai dû faire face à un problème de performance très pénible aujourd'hui. Nous avons une appli .Net qui s'est mise à partir complètement en sucette à cause d'une requête.
Mon analyse c'est que les plans d'exécution ont changé et que la-dite requête, très mal écrite, a mal supporté le changement
J'ai donc proposé une optimisation qui fonctionnait très bien... sauf dans l'appli. Finalement, on a mis le doigt sur le problème : cette requête est exécutée via sp_executesql avec des paramètres. Je pense que la chaîne de caractères envoyées ne change pas, du fait des paramètres, et le plan d'exécution n'est donc pas recalculé. En changeant juste le type des paramètres (nvarchar(32) -> nvarchar(10)) ça a suffit à forcer le calcul d'un nouveau plan et tout va bien maintenant.
Ma question est donc la suivante :
Considérant une requête du genre :
Comment être sûr, qu'elle aura le même comportement que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part exec N' SELECT name FROM matable WHERE id = @ids ',N'@ids nvarchar(14)',@ids=N'2ZYB'
A défaut, y a-t-il une meilleure manière de procéder alors que j'ai toujours vécu dans l'idée que les variables c'est bon, mangez-en et tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT name FROM matable WHERE id = N'2ZYB'
Merci
Partager