Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Délai d'expiration de la requête SQL Server en fonction de la clause Where

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 :

  1. Utilisez le SQL dynamique (mais lisez ceci en premier :la malédiction et les bénédictions du SQL dynamique)

  2. Utilisez OPTIMIZE FOR

  3. Utilisez WITH(RECOMPILE)