Maison >base de données >tutoriel mysql >Fonctions table en ligne ou à instructions multiples dans SQL Server : laquelle devriez-vous choisir ?
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!