我目前工作中,我使用递归CTE的功能,但似乎都表现不佳。我需要这个功能(所以没有临时表),所以我可以很容易地在存储过程中使用它。功能的递归CTE似乎是很慢
下面是代码:
CREATE FUNCTION [dbo].[Web_GetDailyLoadListUDF]
(
@CustomerID INT
, @StartDate DATETIME
, @Days INT
, @IncludeChildren BIT
)
RETURNS @TableOfValues TABLE
(
RowID SMALLINT IDENTITY(1,1)
, DailyLoadCount INT
, DailyLoadDate VARCHAR(6)
, FullDate DATETIME
)
AS
BEGIN
DECLARE @MaxDate DATETIME;
SET @MaxDate = DATEADD(dd, @Days * -1.7, DATEDIFF(dd, 0, @StartDate));
WITH DateCTE AS
(
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @StartDate)) AS DateValue
UNION ALL
SELECT DATEADD(DAY, -1, DateValue)
FROM DateCTE
WHERE DATEADD(DAY, -1, DateValue) > @MaxDate
)
INSERT INTO @TableOfValues
SELECT * FROM
(
SELECT TOP (@Days)
(
SELECT COUNT(*)
FROM dbo.[Load] l WITH (NOLOCK)
JOIN dbo.LoadCustomer lc WITH (NOLOCK)
ON lc.LoadID = l.ID
JOIN dbo.Customer c WITH (NOLOCK)
ON c.ID = lc.CustomerID
WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, l.LoadDate)) = dct.DateValue
AND l.StateType = 1
AND lc.Main = 1
AND (c.ID = @CustomerID OR (@IncludeChildren = 1 AND c.ParentCustomerID = @CustomerID))
) AS DailyLoadCount
, CONVERT(VARCHAR(6), dct.DateValue, 107) AS DailyLoadDate
, dct.DateValue
FROM DateCTE dct
WHERE
DATEPART(DW, dct.DateValue) NOT IN (1, 7)
AND dct.DateValue NOT IN
(
SELECT HolidayDate FROM Holiday
)
ORDER BY dct.DateValue DESC
) AS S
ORDER BY s.DateValue ASC
RETURN
END
什么这个SQL应该检索是每天负载的数量,在过去的@days是工作日(没有周末/节假日)。
我基本上只需要一些帮助优化这使得它不会跑这么慢。 (每位顾客花费20秒,这将被称为超过数千)。
我不认为这个问题是与你的递归表(它应该是相当快),但对你的'SELECT' – Lamak 2011-02-24 17:54:11