我目前工作中,我使用遞歸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