ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » SAP R/3 » 系统开发及跨应用设置 » 请教一个关于程序执行效率的问题

标题: 请教一个关于程序执行效率的问题
离线 liu_shaofeng
初级会员



精华贴数 0
个人空间 0
技术积分 34 (37367)
社区积分 0 (1387985)
注册日期 2007-5-11
论坛徽章:0
      
      

发表于 2007-5-11 21:37 
请教一个关于程序执行效率的问题

最近在做一个程序的效率化,原来的程序执行起来特别慢,差不多每次要六个小时以上。数据量大是原因之一,但是看一下源代码,发现还是可以改善的,但是按照预想的修正以后,执行的效率并没有提高,反而要比修正前还要慢十分钟左右。下面是我的修正过程,还有我的一点想法,不知道各位有什么想法。
原程序的数据处理全部使用select-endselect,因此这次修正主要是把select-endselect修改成select into 内部表, 然后再loop内部表.但是效率并没有高。数据量都是百万数量级的。以下是我的一些想法。
为了方便描述,以下数据库名用db表示,内部表名用tbl表示。
情况(1)
记述1
select * from db1.
  (中间省略)
  insert db2.
endselect.
记述2
select * from db1   into table tbl1.
loop at tbl1.
  (中间省略)
  insert db2.
endloop.

如果是上面的这种情况,从数据库表1抽数据,然后对数据库表2进行插入操作,毫无疑问应该是上面的记述2所用的方法效率更高。
情况(2)
记述3
select * from db1.
  (中间省略)
  update db1.
endselect.
记述4
select *  from db1   into table tab1.
loop at tbl1.
  (中间省略)
  update db1.
endloop.

如果是上面的这种情况,从数据库表1抽数据,进行一些处理之后,还是对数据库表1进行更新,我不敢完全确定记述4的方法就一定比记述3的效率更高,因为记述3中,虽然说select-endselect可能比较费时间,但是系统会保留当前记录的index,这样更新的时候会快一些.记述4中使用内部表,抽数据可能快一些,但是更新的时候系统是不是还要再重新找到这条数据才能进行更新,会不会因此变慢呢?

我现在碰到的就是上面的情况(2),我把原来的记述3改成记述4,效率没有提高反而慢了一些.所以很迷惑。
注:上述所有的测试是在网络情况基本稳定,数据库表的索引也一样的情况下进行的,所以基本上可以排除网络的原因以及数据库表索引的影响。


只看该作者    顶部
离线 super_r3
初级会员



精华贴数 0
个人空间 0
技术积分 30 (41019)
社区积分 0 (1384705)
注册日期 2007-5-9
论坛徽章:0
      
      

发表于 2007-5-12 20:04 
我同意你的分析,同时你的测试也验证了你的猜测。

不过好像有一个 modify/update from 句,可以通过内表整体更新数据库
楼主不妨试一试。


只看该作者    顶部
离线 showxz
扫地僧


精华贴数 0
个人空间 0
技术积分 863 (2173)
社区积分 25 (6863)
注册日期 2006-5-16
论坛徽章:2
ITPUB新首页上线纪念徽章生肖徽章:羊    
      

发表于 2007-5-14 10:35 
又了解了OPEN SQL一点了


__________________
welcome to my blog:http://showxz.bokee.com/
只看该作者    顶部
离线 liu_shaofeng
初级会员



精华贴数 0
个人空间 0
技术积分 34 (37367)
社区积分 0 (1387985)
注册日期 2007-5-11
论坛徽章:0
      
      

发表于 2007-5-14 22:34 
有没有人给点意见,
拜托各位大侠,小弟才疏学浅,恳请贵人相助


只看该作者    顶部
离线 zhoufm
初级会员



精华贴数 0
个人空间 0
技术积分 48 (28817)
社区积分 0 (986487)
注册日期 2006-6-12
论坛徽章:0
      
      

发表于 2007-5-15 12:56 
等待高人回答,这个问题也感兴趣,

顶一下,


__________________
SAP入门中,abap提高中,电子商务的光明前景啊,照耀我吧。
只看该作者    顶部
离线 wangyuzhen
白开水


精华贴数 6
个人空间 0
技术积分 9057 (132)
社区积分 3117 (434)
注册日期 2001-11-1
论坛徽章:13
现任管理团队成员ITPUB元老2008北京奥运纪念徽章:皮划艇激流回旋2008年新春纪念徽章生肖徽章2007版:龙ITPUB新首页上线纪念徽章
      

发表于 2007-5-15 15:27 


QUOTE:
最初由 super_r3 发布
我同意你的分析,同时你的测试也验证了你的猜测。

不过好像有一个 modify/update from 句,可以通过内表整体更新数据库
楼主不妨试一试。


记述4的问题所在就是使用了低效率的更新语句,实际上ABAP对于批量更新是应该用super_r3所说的这样的语句。

总结一句,能不用SELECT-ENDSELECT的就不要用。我们这里已经默认不用SELECT-ENDSELECT了,如果开发的用了会被我要求改成用内表的方式,否则我不验收。


__________________
每一缕阳光都照着属于自己的玫瑰
欢迎访问双鱼的天空
只看该作者    顶部
离线 sunkingpeng
初级会员



精华贴数 0
个人空间 0
技术积分 26 (44355)
社区积分 0 (159642)
注册日期 2004-9-17
论坛徽章:0
      
      

发表于 2007-6-13 10:48 
可以优化,我做的就是优化工作

首先不要用select-endselect,一次把数据取数到内表,然后剩下的就是内表之间的事情了。
循环内表的时候,尽量不要用多个loop嵌套在一次,全部改用一个loop,然后里面用
do   read table。。。。 二分法查找标记    enddo,下一个符合的用read table index+1。然后根据逻辑比较第n次和第1次的数据关键字是否一样,一样继续做do  ,不一样,跳出do,做下一个loop,这样这个代码的效率是几十,几百倍的提高


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问