Maison >base de données >tutoriel mysql >Fonctions table en ligne ou à instructions multiples dans SQL Server : laquelle devriez-vous choisir ?

Fonctions table en ligne ou à instructions multiples dans SQL Server : laquelle devriez-vous choisir ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 19:12:42680parcourir

Inline vs. Multi-Statement Table-Valued Functions in SQL Server: Which Should You Choose?

Fonctions table SQL Server : comparaison des fonctions en ligne et des fonctions multi-instructions

Les fonctions table (TVF) de SQL Server permettent de renvoyer plusieurs lignes de données à partir d’un seul appel de fonction. Cependant, les TVF sont principalement divisés en deux types : les fonctions multi-instructions et les fonctions en ligne.

Fonction valorisée par table en ligne (ITVF)

ITVF est défini à l'aide d'une seule instruction SELECT dans la définition de la fonction. Ils se comportent comme des vues, héritant du type de données, de la capacité Null et du classement des colonnes référencées.

Fonction valorisée par table d'instructions multiples (MSTVF)

MSTVF est défini à l'aide de plusieurs instructions, incluant généralement une instruction INSERT pour remplir les variables de la table. Ils nécessitent une déclaration explicite du type de données et des propriétés de la colonne dans la définition de la fonction.

Différence de performances

Malgré la syntaxe différente, la différence de performances entre ITVF et MSTVF est significative. ITVF tire pleinement parti de l'optimiseur de requêtes basé sur les statistiques de table de SQL Server pour générer des plans d'exécution efficaces. MSTVF ressemble plus à une variable de table, l'optimiseur de requêtes a un mauvais effet d'optimisation et l'efficacité du plan d'exécution est relativement faible.

Scénarios applicables

Le choix d'ITVF et MSTVF dépend du scénario d'application spécifique. Si la logique de la fonction peut être exprimée dans une simple instruction SELECT, ITVF est généralement plus efficace et recommandé. MSTVF est plus adapté lorsqu'un traitement ou un paramétrage supplémentaire est requis.

Exemple

Considérons l'exemple suivant :

<code class="language-sql">-- 内联表值函数
CREATE FUNCTION GetUnshippedOrders()
RETURNS TABLE
AS 
RETURN SELECT a.SaleId, a.CustomerID, b.Qty
    FROM Sales.Sales a INNER JOIN Sales.SaleDetail b
        ON a.SaleId = b.SaleId
        INNER JOIN Production.Product c ON b.ProductID = c.ProductID
    WHERE a.ShipDate IS NULL
GO

-- 多语句表值函数
CREATE FUNCTION GetLastShipped(@CustomerID INT)
RETURNS @CustomerOrder TABLE
(SaleOrderID    INT         NOT NULL,
CustomerID      INT         NOT NULL,
OrderDate       DATETIME    NOT NULL,
OrderQty        INT         NOT NULL)
AS
BEGIN
    DECLARE @MaxDate DATETIME

    SELECT @MaxDate = MAX(OrderDate)
    FROM Sales.SalesOrderHeader
    WHERE CustomerID = @CustomerID

    INSERT @CustomerOrder
    SELECT a.SalesOrderID, a.CustomerID, a.OrderDate, b.OrderQty
    FROM Sales.SalesOrderHeader a INNER JOIN Sales.SalesOrderHeader b
        ON a.SalesOrderID = b.SalesOrderID
        INNER JOIN Production.Product c ON b.ProductID = c.ProductID
    WHERE a.OrderDate = @MaxDate
        AND a.CustomerID = @CustomerID
    RETURN
END
GO</code>

Dans cet exemple, MSTVF est utilisé pour calculer la dernière commande expédiée pour un client spécifique, ce qui nécessite un traitement supplémentaire. ITVF n'a besoin que de récupérer la liste de toutes les commandes non expédiées, ce qui est plus adapté aux opérations de filtrage simples.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn