【发布时间】:2022-10-02 16:25:15
【问题描述】:
我有一个查询,它从给定日期获取数据并将其与每个月的同一工作日进行比较(如果它变成星期六、星期日或假期,它应该显示前一天的最后一天,即如果我说 25,它将返回2022 年 9 月 23 日,9 月和 8 月 25 日,8 月等)。 DAILY_DATA 表仅包含工作日,因此有效:
SELECT *
FROM DAILY_DATA A, --It has partitions for every day, like \'PART_300922\'
( SELECT TO_CHAR(DATE,\'MM\'),MAX(DATE) DATE
FROM DAILY_DATA
WHERE TO_CHAR(DATE,\'YYYY\')=\'2022\'
AND TO_CHAR(DATE,\'DD\')<=TO_CHAR(TO_DATE(&query_date),\'DD\')
GROUP BY TO_CHAR(DATE,\'MM\')
)B
WHERE A.DATE = B.DATE
ORDER BY 1;
问题是,它需要很长时间才能循环整个表,有没有办法优化它?也许使用分区或其他东西? 请帮忙。
-
您不能优化在 SELECT 语句中使用子查询的任何内容,因为该子查询必须针对表的每一行执行。此外,对
TO_CHAR的重复函数调用也会减慢执行速度。