web-dev-qa-db-fra.com

SQL Server: fonctions à valeur de table et procédures stockées

J'ai beaucoup lu sur les plans d'exécution et les problèmes de paramètres dynamiques dans les procédures stockées. Je connais les solutions suggérées pour cela.

Ma question, cependant, est tout ce que j'ai lu indique que SQL Server met en cache le plan d'exécution pour les procédures stockées. Aucune mention n'est faite des fonctions table-valeur. Je suppose que c'est le cas pour Views (par intérêt).

Est-ce qu'il recompile chaque fois qu'une fonction Table-value est appelée?

Quand est-il préférable d'utiliser une fonction Table-value plutôt qu'une procédure stockée?

27
IamIC

Une fonction de table inline (TVF) est semblable à 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 à déclarations multiples a un plan (trouvera une référence).

Les TVF sont utiles lorsque vous souhaitez modifier la liste SELECT pour une entrée paramétrée. Les TVF en ligne sont développés et la sélection externe/où sera considérée par l'optimiseur. Pour les TVF multi-instructions, l’optimisation n’est pas vraiment possible car elle doit être complétée, then filter.

Personnellement, j'utiliserais un proc stocké sur un TVF à déclarations multiples. Ils sont plus flexibles (par exemple, des astuces, peuvent changer d'état, SET NOCOUNT ON, SET XACTABORT, etc.).

Je n'ai aucune objection aux TVF en ligne, mais n'essayez pas de les utiliser pour le code client, en raison de l'incapacité d'utiliser SET et de changer d'état.

28
gbn

Je n'ai pas vérifié cela, mais je suppose 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 des vues n'est toutefois pas mis en cache. La requête de la vue faisant partie de la requête utilisant la vue, le plan d'exécution peut donc être mis en cache pour la requête utilisant 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 même aucun résultat.

0
Guffa