【问题标题】:SQL Server 2008R2 User Defined Function (Table valued) PerformanceSQL Server 2008R2 用户定义函数(表值)性能
【发布时间】:2023-04-09 04:31:02
【问题描述】:

我使用的是 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 来查看实际的页面读取等等。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2016-12-26
      • 2018-06-30
      相关资源
      最近更新 更多