Règle générale sur l'utilisation de l'option WITH RECOMPILE
Je comprends que l'option with RECOMPILE les forces de l'optimiseur pour reconstruire le plan de requête pour les procs, mais quand vous voulez que cela se produise?
Ce sont quelques règles de base sur l'utilisation de l'option with RECOMPILE et quand ne pas le faire?
Quelle est l'efficacité de frais généraux associés à la il suffit de le mettre sur chaque procédure stockée?
source d'informationauteur Bob Probst
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont dit, vous ne voulez pas de simplement inclure
WITH RECOMPILE
dans chaque procédure stockée comme une question d'habitude. En faisant cela, vous seriez en éliminant l'un des principaux avantages de procédures stockées: le fait qu'il permet d'économiser le plan de requête.Pourquoi est-ce que potentiellement une grosse affaire? Le calcul d'un plan de requête est beaucoup plus intense que la compilation régulière code de procédure. Parce que la syntaxe d'une instruction SQL spécifie uniquement ce vous voulez, et non pas (en général), comment pour l'obtenir, qui permet à la base de données un grand degré de flexibilité lors de la création du plan physique (c'est l'étape par étape les instructions pour fait de recueillir des données et de les modifier). Il y a beaucoup de "trucs" à la requête de base de données pré-processeur peut faire et les choix qu'il peut faire - ce que pour joindre les tables, les index pour les utiliser, que ce soit pour appliquer
WHERE
clauses avant ou après les jointures, etc.Pour une instruction SELECT simple, il ne pourrait pas faire une différence, mais pour n'importe quel non-trivial de la requête, la base de données va passer un peu de temps (mesuré en millisecondes, contrairement à l'habitude microsecondes) à venir avec un plan optimal. Pour vraiment requêtes complexes, il ne peut même pas garantir une optimale plan, il suffit d'utiliser des heuristiques pour trouver une assez bonne plan. Donc, en l'obligeant à recompiler à chaque fois, vous avez dit qu'il doit passer par le processus encore et encore, même si le plan qu'il a eu avant était parfaitement bon.
Selon le vendeur, il devrait être automatique des déclencheurs pour recompiler les plans de requête - par exemple, si les statistiques sur une table de changer de manière significative (par exemple, l'histogramme des valeurs dans une colonne spécifique commence uniformément distribué par au fil du temps devient très inégale), puis la DB est à noter que et de recompiler le plan. Mais d'une manière générale, la mise en œuvre d'une base de données vont être plus intelligent que l'ensemble des que vous.
Comme tout ce qui est lié à la performance, ne pas prendre des photos dans l'obscurité; la figure où les goulets d'étranglement qui coûtent 90% de vos performances, et de les résoudre en premier.
De le mettre sur chaque procédure stockée n'est PAS une bonne idée, parce que la compilation d'un plan de requête est une opération relativement coûteuse et vous ne verrez pas de bénéficier de la requête des plans de mise en cache et ré-utilisés.
Le cas d'une dynamique où la clause construit à l'intérieur d'une procédure stockée peut être manipulé à l'aide de
sp_executesql
pour exécuter le TSQL plutôt que d'ajouterWITH RECOMPILE
à la procédure stockée.Une autre solution (SQL Server à partir de 2005) est l'utilisation de l'indice des paramètres spécifiques à l'aide de la
OPTIMIZE FOR
soupçon. Cela fonctionne bien si les valeurs dans les lignes sont statiques.SQL Server 2008 a mis en place un peu connu appelé "
OPTIMIZE FOR UNKNOWN
":L'usage le plus commun est lorsque vous avez une dynamique clause where dans une procédure...vous ne voudriez pas que ce plan de requête pour obtenir compilé et enregistré pour les exécutions suivantes, car il pourrait très bien ne pas être exactement la même clause, la prochaine fois que la procédure est appelée.
généralement une bien meilleure alternative à
WITH RECOMPILE
estOPTION(RECOMPILE)
comme vous pouvez le voir sur l'explication ci-dessous, prises de la réponse à cette question ici
Il ne doit être utilisé lors de l'essai avec reprentative les données et le contexte de démontrer que l'on fait sans produit non valide les plans de requête (quelles que soient les raisons possibles peuvent être). Ne présumez pas à l'avance (sans test) que le PS n'optimise pas correctement.
Seule exception pour l'appel manuel uniquement (c'est à dire ne pas de code dans le SP): Quand vous savez que vous avez considérablement modifié le caractère de la table cible. par exemple, TRONQUER, chargement en vrac, etc.
C'est encore une autre occasion pour l'optimisation prématurée.
Remarque: j'ai beaucoup de points. Si un newby soumet la même réponse ci-dessous, et vous acceptez, upvote leur.