获取的sql monitor执行计划如下, 执行时间一小时以上,其中一个大分区表(610个分区)的全表扫描消耗占了绝大部分:
SQL代码如下:
问题的关键在于最后一个红框的写法,EP2EAS_ITGOPENACCOUNT_HIST...表是以LOAD_DATE字段做按天list分区, 因为在分区字段上使用了函数,优化器无法做分区裁剪,只能扫描全部分区....如果我们把函数放到前面FST.TRANSDATE字段上,那样就不需要读610个分区,只需要读1个分区就行了,即把FST.TRANDATE = TO_CHAR (TO_DATE (SCD.LOAD_DATE...从610个分区到1个分区, 效率提升应该比较清楚了.
可能有人会问, FST.TRANDATE字段上使用了函数, 不会对其他的分区表有影响吗?...如果我们在SCD子查询内部的STATUS='0'后面也增加一个and LOAD_DATE= :B1 , 结果集等价,效果也是一样的, 就不用做前面那个改动了.