12
返回列表 发新帖
楼主: zzj_rainbow

LOOP一个内表,然后LOOP里面的操作有select的语句,这样怎么优化?

[复制链接]
论坛徽章:
3
2012新春纪念徽章
日期:2012-01-04 11:58:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2013-1-29 14:42 | 只看该作者
想优化就只能 看看 能不能把select的内容提出来,如果可以就用8楼的方法,如果不可以就对这个LOOP的内表进行排序 然后再LOOP里面用AT NEW ...END AT。看可不可以减少内表中相同数据对数据库的查询。

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
12#
 楼主| 发表于 2013-1-29 16:33 | 只看该作者
syd180286 发表于 2013-1-29 14:42
想优化就只能 看看 能不能把select的内容提出来,如果可以就用8楼的方法,如果不可以就对这个LOOP的内表进行 ...

mark,谢谢!

使用道具 举报

回复
论坛徽章:
9
ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20茶鸡蛋
日期:2012-12-14 17:02:392013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:10法拉利
日期:2014-01-10 15:27:45本田
日期:2014-02-07 17:01:332014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
13#
发表于 2013-1-29 17:18 | 只看该作者
最好看标准的优化例子,很多方面都可以考虑以,以下只是个人在代码时的习惯,其它方面参看标准例子考虑:
1.LOOP里最好不要用SELECT,把需要的SELECT放在LOOP外面来减少与数据连接的次数,连接数据库是需要时间的;
2.LOOP里最好也不要再嵌套其它的LOOP;
3.在LOOP里用READ TABLE时最好带上BINARY SEARCH;
4.如LOOP中数据太多,BINARY SEARCH还觉得不够优化的话,考虑使用在LOOP 中再使用DO(例子最后),这个一般只有实在需要性能优化时才用,主要是太麻烦;
5.活用DELETE ,MOVE等,这些只能自己据实业功能需求来定了;

如下只是系统标准例子中的一个,后面一个代码比前一个代码更快
  1. * Entries: 1000 (ITAB1), 300 (ITAB2)
  2. * Line width: 100
  3. * Both tables sorted by unique key K ascending

  4. LOOP AT ITAB1 INTO WA1.
  5.   READ TABLE ITAB2 INTO WA2
  6.              WITH KEY K = WA1-K BINARY SEARCH.
  7.   IF SY-SUBRC = 0.
  8.     " ...
  9.   ENDIF.
  10. ENDLOOP.
复制代码
  1. DATA: I TYPE I.

  2. I = 1.
  3. LOOP AT ITAB1 INTO WA1.
  4.   do.
  5.     READ TABLE ITAB2 INTO WA2 INDEX I.
  6.     IF SY-SUBRC <> 0. EXIT. ENDIF.
  7.     IF WA2-K < WA1-K.
  8.       ADD 1 TO I.
  9.     ELSEIF WA2-K = WA1-K.
  10.       " ...
  11.       ADD 1 TO I.
  12.       EXIT.
  13.     ELSE.
  14.       EXIT.
  15.     endif.
  16.   enddo.
  17.   if sy-subrc <> 0. exit. endif.
  18. ENDLOOP.
复制代码

使用道具 举报

回复
论坛徽章:
15
ITPUB元老
日期:2005-04-13 09:47:24管理团队成员
日期:2013-06-05 17:37:00ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主6段
日期:2012-08-09 02:21:03ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36ITPUB年度最佳版主
日期:2011-04-08 18:37:09BLOG月度发帖之星
日期:2010-05-01 02:15:42ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
14#
发表于 2013-1-30 01:03 | 只看该作者
zzj_rainbow 发表于 2013-1-29 09:40
但是call的那个function必须用到LOOP的内表的数据,然后LOOP里面的那个select必须用内表的一个字段和call ...

取一个全量表,不过这个需要内存足够大

使用道具 举报

回复
论坛徽章:
64
状元
日期:2015-07-20 15:43:53榜眼
日期:2015-07-16 12:57:31探花
日期:2015-07-06 10:48:48进士
日期:2015-06-25 16:41:54举人
日期:2015-06-18 09:00:04秀才
日期:2015-08-06 13:55:21秀才
日期:2015-06-30 10:57:59秀才
日期:2015-07-17 10:06:26秀才
日期:2015-07-20 08:54:46秀才
日期:2015-07-20 09:00:26
15#
发表于 2013-1-30 07:31 | 只看该作者
nice job

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
16#
 楼主| 发表于 2013-1-30 09:41 | 只看该作者
yan252 发表于 2013-1-29 17:18
最好看标准的优化例子,很多方面都可以考虑以,以下只是个人在代码时的习惯,其它方面参看标准例子考虑:
...

mark,谢谢!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表