2010-02-25 2 views

ответ

0

Как Митч Пшеница предлагает его комментарий, вероятно, лучший способ улучшить производительность этого запроса - использовать numbers table вместо рекурсивного CTE, используемого для генерации списка дат.

Если вы не можете или не использовать таблицу чисел, производительность диапазона дат КТР может быть улучшена для больших диапазонов с использованием метода, предложенного Ицик Бен-Ган:

DECLARE @t TABLE(startdate DATETIME , enddate DATETIME) 
INSERT INTO @t 
    SELECT '8/01/2009','08/31/2009' UNION ALL 
    SELECT '2/01/1900','02/28/1900' UNION ALL 
    SELECT '10/01/1959','10/31/1959' 

DECLARE @n INT 
SET @n = DATEDIFF(dd,'19000201','20090831') + 1 

;WITH base 
AS 
( 
     SELECT 1 AS n 
     UNION ALL 
     SELECT n+1 FROM base 
     WHERE n < CEILING(SQRT(@n)) 
) 
,cross_cte 
AS 
( 
     SELECT 0 AS c 
     FROM base AS b1 
     ,base AS b2 
) 
,dates_cte 
AS 
(
     SELECT TOP(@n) CAST('19000201' AS DATETIME) - 1 + ROW_NUMBER() OVER(ORDER BY c) AS date 
     FROM cross_cte 
) 
SELECT DISTINCT d.DATE     
FROM Dates_Cte d 
JOIN @t t 
ON d.DATE BETWEEN t.startdate AND t.enddate 
OPTION (MAXRECURSION 0); 

Хотя план выполнения показывает, что эта версия будет немного менее эффективной, чем оригинал (= ~ 1%), измерение с SET STATISTICS TIME в моей системе показывает, что истекшее и процессорное время для этой версии меньше половины вашей версии.

+0

@ priyanka.bangalore - метод относится к эффективному использованию CTE для генерации больших диапазонов чисел, а не конкретно к датам. Я думаю, что это в одной из книг «Inside SQL Server 2005» от Solid Quality Learning - я думаю, что программирование T-SQL один - http://www.amazon.co.uk/gp/product/0735621977 –

Смежные вопросы