zoukankan      html  css  js  c++  java
  • 【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。
  • 相关阅读:
    【BZOJ1046】[HAOI2007]上升序列
    【BZOJ1045】[HAOI2008]糖果传递
    【BZOJ1044】[HAOI2008]木棍分割
    【BZOJ1041】[HAOI2008]圆上的整点
    【LG2257】YY的GCD
    【BZOJ1018】[SHOI2008]堵塞的交通
    【LG4735】最大异或和
    【POJ2182】Lost Cows
    【POJ2482】Stars in Your Window
    【POJ1733】Parity game
  • 原文地址:https://www.cnblogs.com/Sapbruce/p/3910073.html
Copyright © 2011-2022 走看看