最近調優過程中遇到一個問題,就是表值函數作為連接中的一部分時,可能會引起麻煩,本文會簡單闡述表值函數是什么,以及為什么使用表值函數進行連接時會引發性能問題。
表值函數SQL Server中提供了類似其他編程語言的函數,而函數的本質通常是一段代碼的封裝,并返回值。在SQL Server中,函數除了可以返回簡單的數據類型之外(Int、Varchar等),還可以返回一個集合,也就是返回一個表。
而根據是否直接返回集合或是定義后再返回集合,表值函數又分為內聯用戶定義表值函數和用戶定義表值函數(下文統稱為表值函數,省去“用戶定義”四個字)。
內聯表值函數
內聯表值函數和普通函數并無不同,唯一的區別是返回結果為集合(表),而不是簡單數據類型,一個簡單的內聯表值函數如代碼清單1所示(摘自MSDN)。
CREATE FUNCTION Sales.ufn_CustomerNamesInRegion
( @Region nvarchar(50) )
RETURNS table
AS
RETURN (
SELECT DISTINCT s.Name AS Store, a.City
FROM Sales.Store AS s
INNER JOIN Person.BusinessEntityAddress AS bea
ON bea.BusinessEntityID = s.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = bea.AddressID
INNER JOIN Person.StatePRovince AS sp
ON sp.StateProvinceID = a.StateProvinceID
WHERE sp.Name = @Region
);
GO
代碼清單1.一個簡單的表值函數
用戶定義表值函數
而用戶定義表值函數,需要在函數開始時定義返回的表結構,然后可以寫任何代碼進行數據操作,插入到定義的表結構之后進行返回,一個稍微負責的用戶定義表值函數示例如代碼清單2所示(摘自MSDN)。
新聞熱點
疑難解答