【ABAP】SELECT-ENDSELECT尽量不要用

ABAP中支持一种SELECT-ENDSELECT的结构,就是可以在SELECT中对取得的每一行数据(或是几个字段)可以先放入一个行结构(或是几个字段)中,再做处理。
初看似乎觉得蛮有用的,的确这个结构本身就是为了方便处理数据的。但是,如果你滥用了这种结构,那么会严重影响程序性能。
我接触过的一个报表程序就是用了这种结构,结果系统运行半年后,这张报表就不能用,原因是什么呢?就是因为数据量大了之后,在SELECT和END SELECT之间做处理的时间会很长,从而导致数据库端因为连接超时而断开。
由此可以判断,SELECT-END SELECT语句在整个过程中是保持数据库连接的,对数据库绝对是个负担。
所以,在大数据量处理的报表中,不能用SELECT-END SELECT这种写法。
经过调整后,那张报表速度有所提高,至少不会被数据库踢掉了。

    一般先建立一张内表ITAB,然后使用SELECT ...... FROM TABLE ... INTO CORRESPONDING FIELDS OF TABLE ITAB  来存储需要的数据,然后对ITAB这个内表进行操作。
SELECT --- ENDSELECT . 这个用法其实是把数据放在一个结构中,然后通过循环使用的。但是使用内表后,那相当于是放在一个缓存中,然后在这个开辟的缓存空间中再次进行循环使用,这样,就可以减少搜索数据的时间,当然,要使用内表里面的数据(我指的是需要使用每一行数据),还是要通过LOOP --- ENDLOOP.来操作的,不过,你可以在LOOP 前,做一个 SORT ITAB BY KEY1的操作,而且在LOOP AT ITAB WHERE 条件,还可以这种用法很好用。
SELECT --- ENDSELECT.的方法,是针对透明表进行操作的, PROVIDE ---- ENDPROVIDE.是针对内表进行操作的,这是两个不同的用法。后者多用于HR。
posted @ 2014-08-13 14:20  Keep Running~  阅读(4123)  评论(0编辑  收藏  举报