有没有哪位大师想练手的,看看以下这个SQL有没有什么优化思路:
背景: 该SQL每天执行一次,其中 t 表非常庞大,有75G,不考虑碎片整理,不考虑并行的情况,只存储考虑SQL优化的情况。这个SQL在SSD盘上执行需要12分钟。
SELECT CASE
WHEN
TRUNC(ADD_MONTHS(t.CLOSEDDATE, 2), 'MM') - 1 > TRUNC(CURRENT_DATE, 'DD') - 1
THEN
t.CLOSEDDATE + TO_CHAR(TRUNC(CURRENT_DATE, 'DD') - 1, 'DD')
ELSE
TRUNC(ADD_MONTHS(t.CLOSEDDATE, 2), 'MM') - 1
END AS STATDATE,
COMCODE,
CHANNELSUBTYPECODE,
RISKCODE,
PERAGENTTYPE,
OUTERDATASRCCODE,
NVL(ROLL2OUTSTANDINGNUMBER, '0') + NVL(ROLL2ENDNOTPAYNUMBER, '0') as ROLL2OUTSTANDINGNUMBER
from WEB_CP_RISK_ALL t
Where CASE
WHEN
TRUNC(ADD_MONTHS(t.CLOSEDDATE, 2), 'MM') - 1 > TRUNC(CURRENT_DATE, 'DD') - 1
THEN
t.CLOSEDDATE + TO_CHAR(TRUNC(CURRENT_DATE, 'DD') - 1, 'DD')
ELSE
TRUNC(ADD_MONTHS(t.CLOSEDDATE, 2), 'MM') - 1
END < TRUNC(CURRENT_DATE, 'DD');
这个SQL的难点在于current_date, 也就是每天执行的时候,都需要将整个表的closedate与当天的时间进行计算对比,因此索引或者函数索引的方式就不太可行。其它能想到的就是物化视图,每天全量刷新一次,然后和这个SQL的执行时间错开。但实际上跟这个SQL一起执行效果上也没啥区别。
请教各位专家,有没有啥好的改写方式。
墨值悬赏

评论

