SQL Server 2008R2 用户定义函数(表值)性能

3

我正在使用SQL Server 2008R2。

我有以下设置:

-- Query #1
SELECT * FROM
Product P
INNER JOIN ProductComments C ON C.ProductId = P.ProductId

-- Query #2
SELECT * FROM 
GetAllProducts() P
CROSS APPLY GetCommentsOfProduct(P.ProductId) C

其中 GetAllProducts()

CREATE FUNCTION GetAllProducts
(      
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT * FROM Product
)

GetCommentsOfProduct(P.ProductId)则是

CREATE FUNCTION [dbo].[GetCommentsOfProduct]
(   
    @ProductId int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT * FROM ProductComments WHERE ProductId = @ProductId
)

查询 #1 和查询 #2 的实际执行计划完全相同,并返回相同结果,它们的查询成本相对于批处理都为50%。这是否意味着 SQL 查询优化器将这些查询转换为相同的查询?为什么调用UDFs没有开销?这是否意味着我可以将所有表格组织成UDFs,在进行JOIN操作时也不会有性能问题?你知道有什么缺点吗?


1
估计的或实际的执行计划?你应该使用“视图”来代替... - Yuck
你知道有什么缺点吗?算了,那有什么好处呢? - AakashM
@AakashM 这与问题无关,因为我只是在询问SQL服务器在这种情况下的技术行为。 - Chris
请记住,实际执行计划使用成本估算,而不是实际成本。 - JNK
@JNK:你是不是想说“预估执行计划使用成本估算”?如果不是,那么在什么时候/何处可以看到实际成本呢? - Andriy M
3
实际的计划将显示实际的行数和操作符,但成本估算仍然基于预计。您可以使用“SET STATISTICS IO ON”来查看实际的页面读取和其他相关信息。 - JNK
2个回答

7

多种方法可以编写表值函数。你正在使用的语法,即AS RETURN,是“内联表值函数”。这相当于一个视图。在执行语句时,SQL Server将展开该函数。调用此类函数没有任何开销。

“多语句表值函数”不等同于视图。优化器无法内联多个语句,因此“多语句TVL”通常会产生显着的开销。


5

这是否意味着,SQL查询优化器将这些查询转换为相同的查询?

是的。内联表值函数被优化器展开成外部查询,有点像宏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接