应用场景:当for all entries in后面跟的内表很大的时候而且不包含待查询表的key值字段的时候,会大大降低程序性能效率。
分析:使用了FOR ALL ENTRIES后,相当于把驱动表里的条件字段的所有值用OR 连起来,一次对DB操作,条件语句增大,势必使内存占用增多。在后面跟的这个内表非常非常大的时候程序还可能会出现“SQL_CAUGHT_RABAX”、“TSV_TNEW_BLOCKS_NO_ROLL_MEMORY”的 dump,意思大概是内存不足,程序dump。
解决办法:
1、首先对for all entries in后面跟的内表itab,进行去重处理。
2、尽可能的使这个内表包含需要查询table的,主键或者索引字段,在查询时尽量按照主键或索引次序字段,写where 语句。
3、对于内表itab中作为条件的字段,不能使用LIKE,BETWEEN,IN比较操作符。因为这些比较操作符都是不确定比较操作符(将选择条件设定 在一个范围内),而FOR ALL ENTRIES IN语句的作用相当于将选择条件块全部并列开来,用OR连接,如果每个OR分支中又是不确定的范围,那么系统性能将大大降低,因此R/3系统在使用该语句 时禁止使用不确定比较操作符。
4、可以分固定条目,分次按range条件取值。减少单次内存占用量
5、使用for all entries in一定要判断,后面跟的内表itab不为空,不然相当于全表查询。
6、使用for all entries in检索出来的字段,应该包含唯一性记录相关的字段,因为for all entries in查出来的记录会默认去除重复项。