问题:同事在做程序调试的时候总是报临时表空间不足,
分析:当前数据库临时表空间大小为110G,查询中用到的表在2天前收集过统计信息,程序中用到了global temporary table 而且是on commit preserve rows
此程序中有3条主要查询语句,在第3条语句执行时临时表空间开始极具增大,当系统全部临时表空间被占满后,程序报错。查看语句的执行计划,发现使用到了merge join cartesian。笛卡尔积所在的表其中一个是临时表且当前无数据,可能oracle认为笛卡尔积是最有效的方式。
解决方法:1、在笛卡尔积的查询处加hint注释/*+ OPT_PARAM('_optimizer_mjc_enabled','false') */ 通过session级别修改内置参数来禁用笛卡尔积。
2、将全局临时表的on commit preserve rows修改为on commit delete rows,并且循环一次提交一次事务,以重用临时表空间
修改前执行计划为
修改后的执行计划为