Le problème que vous rencontrez est (presque certainement) dû à un plan de requête mis en cache, qui convient à certaines versions de paramètres transmis à la requête, mais pas à d'autres (aka Parameter Sniffing).
Il s'agit d'un phénomène courant, souvent aggravé par des statistiques obsolètes et/ou des index très fragmentés.
Première étape :assurez-vous d'avoir reconstruit tous vos index et que les statistiques sur les colonnes non indexées sont à jour. (Assurez-vous également que votre client dispose d'une tâche de maintenance d'index régulièrement planifiée)
exec sp_msforeachtable "DBCC DBREINDEX('?')"
go
exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go
C'est la référence canonique :Lent dans l'application, rapide dans SSMS ?
Si le problème persiste après la reconstruction des index et la mise à jour des statistiques, vous avez plusieurs options :
-
Utilisez le SQL dynamique (mais lisez ceci en premier :la malédiction et les bénédictions du SQL dynamique)
-
Utilisez
OPTIMIZE FOR
-
Utilisez
WITH(RECOMPILE)