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

Posted

技术标签:

【中文标题】SQL Server 2008R2 用户定义函数(表值)性能【英文标题】:SQL Server 2008R2 User Defined Function (Table valued) Performance 【发布时间】:2012-01-09 13:54:37 【问题描述】:

我使用的是 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 操作时也不会出现性能问题?你知道有什么缺点吗?

【问题讨论】:

估计的还是实际的执行计划?您应该为此使用VIEWs... “你知道有什么缺点吗?”——别在意,优点是什么?? @AakashM 这与这个问题无关,因为我只是询问 SQL 服务器在这种情况下的技术行为。 实际执行计划使用成本估算,而不是实际成本。请记住这一点!!! @AndriyM - 实际计划将显示实际行数和运算符,但成本金额仍基于估计值。您可以使用SET STATISTICS IO ON 来查看实际的页面读取等等。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于SQL Server 2008R2 用户定义函数(表值)性能的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows Server 2008R2上面批量添加AD用户及自定义OU批量添加用户

sql server 2008r2的tempdb很大怎么办

SQL SERVER 2008R2 错误码查询地址

PowerDesigner 16.5 链接SQL Server 2008R2

如何安装SQL server 2008R2

sql server 2008r2默认实例名登录(服务器)时应该怎么写?