Il existe plusieurs façons d'assurer la recompilation d'une procédure stockée :
- en utilisant
WITH RECOMPILE
, - rendre la procédure stockée dynamique (pensez
exec()
) - marquer la proc pour la recompilation avec
sp_recompile
. - modifier le schéma sur lequel repose un plan de requête mis en cache
- appeler
DBCC FREEPROCCACHE
- Au niveau de la requête, une instruction individuelle dans une procédure peut être recompilée avec l'indicateur de requête RECOMPILE (SQL 2008).
Facteurs de recompilation
Outre les facteurs déterminants répertoriés ci-dessus, qu'est-ce qui cause la recompilation des procédures stockées ? Eh bien, beaucoup de choses. Certains d'entre eux sont entrelacés avec la liste ci-dessus, mais je veux les re-présenter parce que ce n'est peut-être pas évident.
- Insérer ou supprimer de nombreuses données (la densité des données dans les index et les tables contrôle souvent les plans de requête)
- Reconstruction des index (modification des objets sous-jacents)
- Création/suppression de tables temporaires (encore une fois, modifications DML sous-jacentes).
- le plan de requête expire (pensez qu'il n'a pas été utilisé récemment et que SQL veut nettoyer l'utilisation de la mémoire)
Ce n'est en aucun cas une liste exhaustive. L'optimiseur de requêtes évolue et surprend peu importe depuis combien de temps vous utilisez SQL Server. Mais voici quelques ressources qui peuvent être utiles :
- Dépannage de la recompilation des procédures stockées (un ancien, mais un goodie)
- Recompilation des procédures stockées
- Optimisation des procédures stockées SQL Server pour éviter les recompilations
- Mise en cache et réutilisation du plan d'exécution (à lire absolument)
MAIS ATTENDEZ - IL Y A PLUS !
Cela dit, la présomption dans votre question est que les recompilations sont toujours mauvaises pour les performances. En fait, souvent la recompliation est bonne.
Alors, quand voudriez-vous qu'il recompile? Regardons un exemple d'un proc qui recherche par nom de famille. Les procédures stockées font 'reniflage de paramètres
' qui est une bénédiction (si cela fonctionne pour vous) et une malédiction (si cela fonctionne contre vous). Premier passage quelqu'un recherche sur Zebr%
pour Zerbrowski. L'index des noms de famille se rend compte que c'est très spécifique et renverra, disons, 3 lignes sur un million - donc un plan d'exécution est construit. Avec le proc compilé pour un résultat de ligne bas, la prochaine recherche est pour S%
. Eh bien, S est votre nom le plus courant et correspond à 93 543 lignes sur 1 million.