如何优化超时任务统计查询中的两个日期的工作日计算?

我有一个表有工作开始日期,工作结束日期两个字段,现在希望统计工作超时的总数,我新建了一张日历表来维护日期的工作日状态。

表:workdays

id                status
2020-01-01            4
2020-01-02            1
2020-01-03            1
2020-01-04            2

4 节假日
1 工作日
2 周末

我新建了一个函数来计算两个日期之间的工作日(排除周末,节假日)。

create or replace function get_workday_count (start_date in date, end_date in date)
return number is
    day_count int;
begin
    select count(0) into day_count from WORKDAYS
    where TRUNC(ID) >= TRUNC(start_date)
    and TRUNC(ID) <= TRUNC(end_date)
    and status in (1, 3, 5);
    return day_count;
end;

现在执行统计时,发现查询时间很长(测试数据20多万行)。

select count(0) from ERP_SJ GET_WORKDAY_COUNT(start_date, end_date) > 5;

查询语句中用到的字段都有建立索引。
请问要怎么优化?或者是否有其他更好的解决方案?

阅读 3.5k