SSIS加速工作日计算查询

SSIS Speed up working days calculation query

对于数据库中的每一行,我需要计算 2 天之间的工作日数。所以我创建了一个函数,它接受 2 个日期参数,连接到日期维度并计算输入时间段之间的工作日数。这工作正常预期它非常慢,因为它必须为每一行进行计算。

只是为了比较,如果我 select 只是来自 table 的随机列(不包括 cycleTime 计算),那么速度是几秒钟内 100 万行。 如果我包括使用 sql 函数的 CycleTime 计算,则速度为每 10 秒 15k 行。一百万行总共大约需要 10 分钟。

这里是查询

SELECT 
CycleTime = 
    CASE WHEN DateStarted is not null and DateCompleted is not null
    THEN DM.dbo.ufnCalculateWorkingDays(DateStarted, DateCompleted)
    ELSE NULL 
    END
from MyTable

和功能:

CREATE FUNCTION [dbo].[ufnCalculateWorkingDays]
(
    @StartDate date,
    @EndDate date
)
RETURNS int
AS
BEGIN

    DECLARE @WorkingDays int;

    WITH CTE AS 
    (   
        select WorkingDay = Date 
        from DimDate
        where 
        Date between @StartDate and @EndDate
        AND IsHolidayUSA = 0
        AND IsWeekday = 1
    )

    Select @WorkingDays = COUNT(*) from CTE 

    RETURN @WorkingDays;
END

有没有其他方法可以加快查询速度?

这样的事情怎么样? (显然无法进行性能测试,因为我没有你的数据库):

WITH cte AS (
 SELECT [Date] AS WorkingDay,
 ROW_NUMBER() OVER (ORDER BY [Date] ASC) AS RN
 FROM DimDate
 WHERE IsHolidayUSA = 0
 AND IsWeekday = 1
)
SELECT
 DateStarted,
 DateCompleted,
 c2.RN - c1.RN AS CycleTime
FROM MyTable t
INNER JOIN cte c1
 ON t.DateStarted=c1.WorkingDay
INNER JOIN cte c2
 ON t.DateCompleted=c2.WorkingDay

如果 DateStarted 和 DateCompleted 都包含在同一个索引中,应该会很快。