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 都包含在同一个索引中,应该会很快。
对于数据库中的每一行,我需要计算 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 都包含在同一个索引中,应该会很快。