22

J'ai fait beaucoup de lectures sur les plans d'exécution et les problèmes de paramètres dynamiques dans les procédures stockées. Je connais les solutions proposées pour cela. Ma question, cependant, est tout ce que j'ai lu a indiqué que SQL Server met en cache le plan d'exécution pour les procédures stockées. Aucune mention n'est faite des fonctions de valeur de table. Je suppose qu'il le fait pour les vues (par intérêt).SQL Server: fonctions de table par rapport aux procédures stockées

Recompile-t-il chaque fois qu'une fonction Table-value est appelée?

Quand est-il préférable d'utiliser une fonction Table-value par opposition à une procédure stockée?

+0

duplication possible de [Functions vs Stored Procedures] (http://stackoverflow.com/questions/178128/functions-vs-stored-procedures) –

+0

Cette question a été posée il y a 3 ans. Quel est le but de la fermeture savoir même si c'est un duplicata comme allégué? – IamIC

Répondre

25

Une fonction de valeur de table en ligne (TVF) est comme une macro: elle est développée dans la requête externe. Il n'a pas de plan en tant que tel: le SQL appelant a un plan.

Un TVF multi-états a un plan (trouvera une référence). Les TVF sont utiles lorsque vous voulez faire varier la liste SELECT pour une entrée paramétrée. Les TVF Inline sont étendus et le select externe/où sera pris en compte par l'optimiseur. Pour l'optimisation TVF multi-instructions, il n'est pas vraiment possible car il doit fonctionner jusqu'à la fin, puis le filtre.

Personnellement, j'utiliserais un proc stocké sur un TVF multi-états. Ils sont plus flexibles (par exemple, des astuces, peuvent changer d'état, SET NOCOUNT ON, SET XACTABORT, etc.). Je n'ai pas d'objection aux TVF en ligne mais je n'ai pas tendance à les utiliser pour le code client en raison de l'impossibilité d'utiliser SET et de changer d'état.

+0

Wow, donc la ligne de fond est seulement les procédures d'exécution du cache des procédures stockées, et sont donc la méthode la plus efficace d'interrogation des données, en battant les vues paires. – IamIC

+1

@IanC: affiche également le cache (comme les TVF en ligne). Les process stockés sont juste beaucoup plus flexibles (par exemple, si je veux SET NOCOUNT ON, SET XACTABORT + TRY/CATCH) – gbn

+0

J'utilise des TVF multi-instructions pour une entrée paramétrable variée, avec l'option "OPTION \t (OPTIMIZE FOR (@JobID UNKNOWN. ...)) est-ce optimal? – IamIC

0

Je ne l'ai pas vérifié, mais je considère comme acquis que le plan d'exécution des fonctions est également mis en cache. Je ne vois pas pourquoi cela ne serait pas possible.

Le plan d'exécution pour les vues n'est cependant pas mis en cache. La requête dans la vue fait partie de la requête qui utilise la vue, de sorte que le plan d'exécution peut être mis en cache pour la requête qui utilise la vue, mais pas pour la vue elle-même.

L'utilisation des fonctions par rapport aux procédures stockées dépend du résultat dont vous avez besoin. Une fonction table peut renvoyer un seul résultat, tandis qu'une procédure stockée peut renvoyer un résultat, plusieurs résultats ou aucun résultat.

+0

Une chose que j'ai remarquée est que je ne peux pas ajouter "OPTIMISER POUR INCONNU" aux fonctions, ce qui me fait penser qu'il est nul et non avenu. – IamIC

Questions connexes