【问题标题】:SSIS Speed up working days calculation querySSIS加速工作日计算查询
【发布时间】:2015-02-27 22:21:37
【问题描述】:

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

只是为了比较,如果我只从表中选择随机列(不包括循环时间计算),那么速度是几秒钟内 100 万行。 如果我包括使用 sql 函数的 CycleTime 计算,则速度为每 10 秒 15k 行。 100 万行总共需要 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

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

【问题讨论】:

    标签: sql performance function ssis


    【解决方案1】:

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

    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 都包含在同一个索引中,它应该很快。

    【讨论】:

    • 还可以将其添加为日期维度上的WorkingDayNumber 列,以使其更快。猜猜唯一需要注意的是在非工作日发生的 DateStarted 和 DateCompleted。
    • 没错,如果修改 DimDate 表是一种选择,那就更好了。
    • 这要快得多,我会说足够快,所以我不需要修改 DimDate。谢谢 :) 顺便说一句,我们的查询中缺少逗号,第二行
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2010-09-25
    • 2022-01-17
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多