Quels facteurs devrais-je être au courant de cela peut causer une recompilation de procédure stockée excessive? p>
Exemples du code qui entraînera une procédure stockée à recompiler serait utile. Le but serait d'éviter une recompilation si possible, ce qui devrait améliorer les performances. p>
Les chemins SQL dynamiques et variables entraînant des sorties différentes (soit par type de données et / ou nombre de colonnes) semblent pouvoir présenter un problème. Les hypothèses sont-elles correctes? Y a-t-il d'autres exemples? P>
Edit: J'ai trouvé un autre exemple. Créer une table temporaire dans une déclaration de contrôle de flux entraînera un recompilement. p>
3 Réponses :
Il existe quelques façons d'assurer la recompilation d'une procédure stockée: p>
avec recompilement code>, li>
- Faire la procédure stockée dynamique (penser
exec () code>) li>
- Marquage de la procédure pour recompiler avec
sp_recompile code>. li>
- Changer le schéma qu'un plan de requête en cache repose sur LI>
- appelant
dbcc freeProccaccache code> li>
- au niveau de la requête Une instruction individuelle dans un proc pouvant être recompilée avec la requête de requête recompile (SQL 2008). LI>
ul>
FACTEURS DE RECOMPILATION FORT> P>
Outre les facteurs difficiles énumérés ci-dessus, quelles sont les causes de la procédure stockée? Eh bien, beaucoup de choses. Certaines d'entre elles sont entrelacées avec la liste ci-dessus, mais je veux les réexprimer B / C, cela pourrait ne pas être évident. P>
- L'insertion ou la suppression de nombreux données (la densité de données dans les index et les tableaux contrôle souvent les plans de requête) LI>
- Index de reconstruction (une modification des objets sous-jacents) LI>
- créer / déposer des tables Temps (à nouveau, sous-jacentes à des modifications DML). LI>
- Plan de requête Âge (pense pas utilisé récemment et SQL souhaitant à nettoyer l'utilisation de la mémoire) li>
ul>
Ceci n'est en aucun cas une liste exhaustive. L'optimiseur de requête évolue et surprend selon la durée de l'utilisation du serveur SQL. Mais voici quelques ressources pouvant être utiles: p>
- Dépannage de procédures stockées Recompilation (un oldie, mais un goodie) li>
- procédures stockées recomples li>
- Optimisation des procédures stockées SQL Server pour éviter les recompilles < / li>
- mise en cache de plan d'exécution et réutiliser (un doit lire) li>
ul>
mais attendez-y'il plus! strong> p>
Avec cela, la présomption de votre question est que les recomposions sont toujours mauvaises pour la performance. En fait, le rectliation est souvent bon. p>
Alors, quand voudriez-vous que ce soit recompiler? Examinons un exemple d'un procédé qui recherche par nom de famille. Procédures stockées do ' paramètre reniflant ' qui est une bénédiction (si elle fonctionne pour vous) et une malédiction (si cela fonctionne contre vous). Passez d'abord une recherche sur quelqu'un sur zeber% code> pour zerbrowski. L'indice dernier nom réalise ce qui est très spécifique et revenir, disons, 3 lignes d'un million - donc un plan d'exécution est construit. Avec le proc compilé pour un faible résultat de la ligne, la recherche suivante est S% code>. Eh bien, S est votre nom le plus commun et correspond à 93,543 lignes sur 1 million. p>
Certaines options de réglage peuvent provoquer une recompilation de procédure stockée ou même plusieurs recompilations dans une seule exécution!
Certaines de ces options ne peuvent pas être même à l'intérieur du SP P>
--this will cause recompilation SET concat_null_yields_null ON; EXEC spMyProc;
Les paramètres de nombres en option / variant peuvent également ressembler à une recompilation, car les plans sont mis en cache contre une liste d'arguments spécifique. p>
Dans les cas où des déclarations sont converties en SP par la connexion (dans l'espoir de la réutilisation future), les valeurs sont extraites et paramétrées. p>
Si ces paramètres incluent des éléments tels que dans les clauses peuplées de manière dynamique par l'appelant, la liste des paramètres correspond rarement et vous voyez de nouveaux plans générés à chaque fois que la clause de la clause contient un nombre différent de valeurs. P>
Oui. Maintenant quelle est la question?
Je pense que vous devez poser une question spécifique.
J'ai posté une réponse à cette question en double ici: Quand une procédure stockée est-elle recompilée
Dupliqué possible de Quand une procédure stockée est-elle recompilée? (SQL Server)