web-dev-qa-db-fra.com

Différence entre les fonctions scalaires, les valeurs de table et les fonctions d’agrégation dans le serveur SQL?

Quelle est la différence entre les fonctions scalaires, les valeurs de table et les fonctions d'agrégation dans le serveur SQL? Et leur appel depuis une requête nécessite-t-il une méthode différente, ou les appelons-nous de la même manière?

45
Ehsan Jeihani

Fonctions scalaires

Les fonctions scalaires (parfois appelées fonctions définies par l'utilisateur/fonctions définies par l'utilisateur) renvoient une valeur unique en tant que valeur de retour et non en tant que jeu de résultats. Elles peuvent être utilisées dans la plupart des endroits d'une requête ou d'une instruction SET, à l'exception de la clause FROM (et peut-être d'autres endroits?). De plus, les fonctions scalaires peuvent être appelées via EXEC, tout comme les procédures stockées, bien qu'il n'y ait pas beaucoup d'occasions d'utiliser cette capacité (pour plus de détails sur cette capacité, veuillez consulter ma réponse à la question suivante sur DBA .StackExchange: Pourquoi les fonctions à valeur scalaire nécessitent-elles une autorisation d'exécution plutôt que de sélectionner? ). Ceux-ci peuvent être créés à la fois dans T-SQL et SQLCLR.

  • T-SQL (UDF):

    • Avant SQL Server 2019: ces fonctions scalaires posaient généralement un problème de performances car elles s'exécutaient pour chaque ligne renvoyée (ou analysée) et interdisent toujours les plans d'exécution parallèles.
    • À partir de SQL Server 2019: certains fichiers UDF scalaires T-SQL peut être alignés, c’est-à-dire que leurs définitions sont placées directement dans la requête de sorte que la requête n’appelle pas le fichier UDF (comme les iTVF travail (voir ci-dessous)). Certaines restrictions peuvent empêcher un fichier UDF d'être en ligne (si ce n'était pas un mot auparavant, c'est maintenant), et les fichiers UDF pouvant être en ligne ne le seront pas toujours en raison de plusieurs facteurs. Cette fonctionnalité peut être désactivée aux niveaux base de données, requête et UDF individuel. Pour plus d'informations sur cette nouvelle fonctionnalité vraiment géniale, veuillez consulter: Scalar UDF Inlining (veillez à consulter la section "Configuration requise").
  • SQLCLR (UDF): , ces fonctions scalaires sont également exécutées pour chaque ligne renvoyée ou analysée, mais il existe deux avantages importants par rapport aux fonctions UDF T-SQL:

    • À partir de SQL Server 2012, les valeurs renvoyées peuvent être pliées de manière constante dans le plan d'exécution SI l'UDF ne fait pas aucun accès aux données, et s'il est marqué IsDeterministic = true. Dans ce cas, la fonction ne serait pas exécutée pour chaque ligne.
    • Les fonctions scalaires SQLCLR peut fonctionnent dans des plans parallèles (????) si elles ne le font pas aucune accès à la base de données.

Fonctions à valeur de table

Les fonctions à valeur de table (TVF) renvoient des ensembles de résultats et peuvent être utilisées dans une clause FROM, JOIN ou CROSS APPLY/OUTER APPLY De toute requête, mais contrairement aux vues simples, ne peut être la cible d'aucune instruction DML (INSERT/UPDATE/DELETE). Ceux-ci peuvent également être créés à la fois dans T-SQL et SQLCLR.

  • T-SQL MultiStatement (TVF): , comme leur nom l’indique, ces instructions TVF peuvent comporter plusieurs instructions, similaires à une procédure stockée. Les résultats qu’ils vont renvoyer sont stockés dans une variable de table et renvoyés à la toute fin. ce qui signifie que rien n'est renvoyé tant que la fonction n'est pas terminée. Le nombre estimé de lignes à renvoyer, telles que signalées à Query Optimizer (qui a un impact sur le plan d'exécution), dépend de la version de SQL Server:

    • Avant SQL Server 2014: ceux-ci signalaient toujours 1 ligne (oui, seulement 1).
    • SQL Server 2014 et 2016: ils signalent toujours 100 lignes.
    • À partir de SQL Server 2017: la valeur par défaut est de signaler 100 lignes, MAIS dans certaines conditions, le nombre de lignes sera assez précis (sur la base des statistiques actuelles) grâce à la nouvelle fonctionnalité Interleaved Execution .
  • T-SQL en ligne (iTVF): ces fichiers TVF ne peuvent jamais être qu'une seule instruction, et cette instruction est une requête complète, tout comme une vue. Et en fait, les TVF en ligne sont essentiellement une vue qui accepte les paramètres d'entrée à utiliser dans la requête. Ils ne cachent pas non plus leur propre plan de requête car leur définition est placée dans la requête dans laquelle ils sont utilisés (contrairement aux autres objets décrits ici), ils peuvent donc être optimisés bien mieux que les autres types de TVF (????) . Ces TVF fonctionnent assez bien et sont préférables si la logique peut être gérée en une seule requête.

  • SQLCLR (TVF): ces fichiers TVF sont similaires aux fichiers TVF T-SQL MultiStatement en ce sens qu’ils construisent l’ensemble du jeu de résultats en mémoire (même s’il s’agit d’un échange)./page file) avant de tout relâcher à la fin. Le nombre estimé de lignes à renvoyer, tel que rapporté dans Query Optimizer (qui a un impact sur le plan d'exécution), est toujours de 1000 lignes. Étant donné qu'un nombre de lignes fixe est loin d'être idéal, veuillez soutenir ma demande afin de permettre la spécification du nombre de lignes: Autoriser les fichiers TVF (T-SQL et SQLCLR) à fournir des estimations de lignes définies par l'utilisateur à l'optimiseur de requêtes

  • SQLCLR Streaming (sTVF): ces fichiers TVF autorisent le code C #/VB.NET complexe, tout comme les fichiers TVF SQLCLR classiques, mais ont la particularité de renvoyer chaque ligne à la requête appelante au fur et à mesure de leur génération (????). Ce modèle permet à la requête appelante de commencer à traiter les résultats dès l'envoi du premier, de sorte que la requête n'a pas besoin d'attendre la fin du processus complet de la fonction avant de voir les résultats. Et cela nécessite moins de mémoire car les résultats ne sont pas stockés en mémoire jusqu'à la fin du processus. Le nombre estimé de lignes à renvoyer, tel que rapporté dans Query Optimizer (qui a un impact sur le plan d'exécution), est toujours de 1000 lignes. Étant donné qu'un nombre de lignes fixe est loin d'être idéal, veuillez soutenir ma demande afin de permettre la spécification du nombre de lignes: Autoriser les fichiers TVF (T-SQL et SQLCLR) à fournir des estimations de lignes définies par l'utilisateur à l'optimiseur de requêtes

Fonctions d'agrégat

Les agrégats définis par l'utilisateur (UDA) sont des agrégats similaires à SUM(), COUNT(), MIN(), MAX(), etc. et nécessitent généralement une clause GROUP BY. Celles-ci ne peuvent être créées que dans SQLCLR et cette possibilité a été introduite dans SQL Server 2005. De plus, à partir de SQL Server 2008, les UDA ont été améliorées pour prendre en charge plusieurs paramètres d'entrée (????). Une lacune particulière réside dans le fait qu’il n’ya aucune connaissance de la commande de rangées au sein du groupe. Il est donc impossible de créer un total cumulé, ce qui serait relativement facile si la commande pouvait être garantie, au sein d’un SAFE assemblage.


S'il vous plaît voir aussi:

59
Solomon Rutzky

Une fonction scalaire renvoie une valeur unique. Il se peut même qu'il ne soit pas lié aux tables de votre base de données.

Une fonction à valeur de tableau renvoie les colonnes spécifiées pour les lignes de votre table correspondant à vos critères de sélection.

Une fonction à valeur agrégée renvoie un calcul sur toutes les lignes d'un tableau, par exemple, la somme de valeurs.

6
Michael Bennett

fonction scalaire

Retourne une valeur unique. C'est comme écrire des fonctions dans d'autres langages de programmation en utilisant la syntaxe T-SQL.

fonction Table Valued

Est-ce un peu différent par rapport à ce qui précède. Retourne une valeur de table. Dans le corps de cette fonction, vous écrivez une requête qui renverra la table exacte. Par exemple:

CREATE FUNCTION <function name>(parameter datatype)

RETURN table

AS

RETURN

(

-- *write your query here* ---

)

Notez qu’il n’ya pas d’instruction BEGIN & END ici.

fonctions d'agrégation

Inclut des fonctions intégrées utilisées avec la clause GROUP. Par exemple: SUM(), MAX(), MIN(), AVG(), COUNT() sont des fonctions globales.

0
LooselyCoded