最近調(diào)優(yōu)過(guò)程中遇到一個(gè)問(wèn)題,就是表值函數(shù)作為連接中的一部分時(shí),可能會(huì)引起麻煩,本文會(huì)簡(jiǎn)單闡述表值函數(shù)是什么,以及為什么使用表值函數(shù)進(jìn)行連接時(shí)會(huì)引發(fā)性能問(wèn)題。
表值函數(shù)SQL Server中提供了類似其他編程語(yǔ)言的函數(shù),而函數(shù)的本質(zhì)通常是一段代碼的封裝,并返回值。在SQL Server中,函數(shù)除了可以返回簡(jiǎn)單的數(shù)據(jù)類型之外(Int、Varchar等),還可以返回一個(gè)集合,也就是返回一個(gè)表。
而根據(jù)是否直接返回集合或是定義后再返回集合,表值函數(shù)又分為內(nèi)聯(lián)用戶定義表值函數(shù)和用戶定義表值函數(shù)(下文統(tǒng)稱為表值函數(shù),省去“用戶定義”四個(gè)字)。
內(nèi)聯(lián)表值函數(shù)
內(nèi)聯(lián)表值函數(shù)和普通函數(shù)并無(wú)不同,唯一的區(qū)別是返回結(jié)果為集合(表),而不是簡(jiǎn)單數(shù)據(jù)類型,一個(gè)簡(jiǎn)單的內(nèi)聯(lián)表值函數(shù)如代碼清單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.一個(gè)簡(jiǎn)單的表值函數(shù)
用戶定義表值函數(shù)
而用戶定義表值函數(shù),需要在函數(shù)開(kāi)始時(shí)定義返回的表結(jié)構(gòu),然后可以寫任何代碼進(jìn)行數(shù)據(jù)操作,插入到定義的表結(jié)構(gòu)之后進(jìn)行返回,一個(gè)稍微負(fù)責(zé)的用戶定義表值函數(shù)示例如代碼清單2所示(摘自MSDN)。
新聞熱點(diǎn)
疑難解答
圖片精選