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

时间:2012-01-09 13:54:38

标签: sql sql-server user-defined-functions

我正在使用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查询优化器将这些查询转换为同一个查询?为什么调用UDF没有开销?这是否意味着我可以将所有表格构建成UDF,即使在进行JOIN操作时也不会出现性能问题?你知道有任何缺点吗?

2 个答案:

答案 0 :(得分:7)

multiple ways来编写表值函数。您使用AS RETURN的语法是“内联表值函数”。这相当于一个视图。 SQL Server将在执行语句时扩展该功能。调用这种函数没有任何开销。

“多语句表值函数”不等同于视图。优化器不能"inline"多个语句,因此“多语句TVL”通常会产生很大的开销。

答案 1 :(得分:5)

  

这是否意味着SQL查询优化器会转换这些查询   进入同一个查询?

是。内联表值函数由优化程序扩展到外部查询中。有点像宏。