CTE的性能是否优于(UDF)用户定义的功能?

时间:2017-10-02 18:53:23

标签: sql-server tsql

我有查询:

#VALUE!

SELECT c.CustomerName FROM Sales.Customer c WHERE Sales.ufnGetLastOrderDate(c.CustomerId) < DATEADD(DAY,-90,GETDATE()) 用户定义函数(UDF)定义如下:

Sales.ufnGetLastOrderDate

现在我想提高查询的性能。答案是删除UDF并重写报告查询,如下所示:

CREATE FUNCTION Sales.ufnGetLastOrderDate(@CustomerID int)
RETURNS datetime
AS
BEGIN
   DECLARE @lastOrderDate datetime

   SELECT @lastOrderDate = MAX(OrderDate)
   FROM Sales.SalesOrder
   WHERE CustomerID = @CustomerID

   RETURN @lastOrderDate
END

我的问题是为什么查询具有更好的性能?

1 个答案:

答案 0 :(得分:0)

CTE本质上是一种观点。 因此,在您的示例中,使用CTE,将转换为

SELECT c.CustomerName
FROM (
    SELECT CustomerID, MAX(OrderDate) AS [LastOrderDate]
      FROM Sales.SalesOrder
     GROUP BY CustomerID) cte
  INNER JOIN Sales.Customer c ON cte.CustomerID = c.CustomerID
WHERE cte.LastOrderDate < DATEADD(DAY,-90,GETDATE())

首先执行()中的查询,并以批处理方式执行cte.CustomerID连接,作为标量函数,执行多次,每个CustomerID执行一次。