我有查询:
#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
我的问题是为什么查询具有更好的性能?
答案 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执行一次。