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 操作时也不会出现性能问题?你知道有什么缺点吗?
【问题讨论】:
估计的还是实际的执行计划?您应该为此使用VIEW
s...
“你知道有什么缺点吗?”——别在意,优点是什么??
@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批量添加用户