在我们的一种应用情况中,存储过程会用到临时表,DGTT
因为往临时表里面插入的数据量非常大,临时表的数据还要再次做关联操作,所以在存储过程中对这个临时表创建了索引,刚开始的时候并没有对这个临时表做runstats 结果,发现存储过程还是无法正常跑下去,因为关联的数据量太大,在确认是由于没有做runstats的原因后,就在网上搜索了一下,发现使用下面方法可以在存储过程中进行runstats
call sysproc.admin_cmd( 'runstats on table SESSION.GT_T_SEC_AC_AR_BA_1 with distribution and detailed indexes all');
把这一段代码放到存储过程后,发现依然跟前面一样,存储过程跑很久都没有结果,这时我想起,做完runstats得commit提交的,平常我们手动做runstats或者用脚本执行db2 runstats on table时,那都会自动提交的,而在存储过程里面,则不会自动提交,必须在runstats完后进行commit提交,所以将上述代码改成下面这样,存储过程就正常了。
CREATE INDEX SESSION.GT_IDX_SEC_AC_AR_BA_1 ON SESSION.GT_T_SEC_AC_AR_BA_1(SRC_TYPE asc,SRC_STM_ID ASC,UNQ_ID_SRC_STM ASC) ALLOW REVERSE SCANS;
call sysproc.admin_cmd( 'runstats on table SESSION.GT_T_SEC_AC_AR_BA_1 with distribution and detailed indexes all');
commit;
这里还得注意,临时表跟commit提交的关系,在创建临时表时如果有跟ON COMMIT DELETE ROWS
就不能这么用了,关于这方面可以参考下面文章:
阅读(3136) | 评论(0) | 转发(0) |