2010-05-28 6 views
1

Je m'interroge sur la différence de performances entre la procédure stockée et la fonction scalaire. Pour l'instant, j'utilise principalement des fonctions scalaires, car je peux les utiliser dans d'autres requêtes (et 99% du temps, elles retournent 1 valeur de toute façon). Mais il y a des fonctions scalaires que je n'utilise jamais dans d'autres requêtes et je les appelle habituellement avec un simple SELECT dbo.somefunction (paramètre) et c'est tout.Performances de la procédure stockée par rapport à la fonction scalaire dans Microsoft SQL Server

Serait-il préférable, du point de vue des performances, de les migrer vers une procédure stockée?

Répondre

7

Les fonctions à valeur scalaire sont recompilées à chaque appel. En effet, ils ne peuvent pas être inclus dans le cache de plan créé à partir du sql traité par l'optimiseur de requête/processeur. Pour les cas où vous n'appelez qu'une seule fois l'udf, (comme dans Select dbo.UDFName(params)) cela n'a pas beaucoup d'importance, mais si vous utilisez un udf de valeur scalaire dans une requête qui examine un million de lignes, l'udf sera compilé des millions de fois. Ce sera certainement un coup de performance. Il y a une technique où (si l'algorithme peut être écrit dans une structure basée sur un ensemble) que vous pouvez convertir des UDF scalaires en ce qu'on appelle des UDFS en ligne à valeur de table qui renvoient une ligne/une table de colonnes ... inclus dans les requêtes sql planifier des caches avec le reste du sql, donc ils ne sont pas soumis à ce coup de performance ...

+1

Ne sous-estimez pas ce que Charles a déclaré. Les FDU sont excellents, mais ils peuvent constituer un énorme goulot d'étranglement au niveau des performances. –

2

Il n'y a pas d'absolu ici, le diable est dans les détails. La meilleure approche consiste à tester une situation donnée en examinant le plan de requête et les statistiques.

En outre, que la fonction soit CLR ou non peut faire une différence de plusieurs ordres de grandeur.

Questions connexes