Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347509
  • 博文数量: 25
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-28 13:22
个人简介

生命在于折腾

文章分类

全部博文(25)

文章存档

2015年(1)

2011年(3)

2010年(4)

2009年(17)

我的朋友

分类: 架构设计与优化

2011-06-13 21:44:28

4,  For All EntriesSelect Single的比较

就个人而言,笔者不是很喜欢For All Entries语句,因为它的缺点多于优点。很多人都会说,为什么呀,For All Entries不是比Select Single快么?事实到底怎样呢,让我们做个比较。

假设我们有个内表代表销售订单的行项目,该内表有10万行。此时我们要根据LIPSVGBELVGPOS,查询这些订单行项目对应的交货单行项目。

 

如果用SELECT SINGLE的话写法很简单:

LOOP AT it_vbap INTO wa_vbap.

SELECT SINGLE vbeln posnr

FROM lips INTO (wa_vbap-vbeln_vl, wa_vbap-posnr_vl)

WHERE vgbel = wa_vbap-vbeln AND

vgpos = wa_vbap-posnr AND

vgtyp = ‘C’.

  MODIFY it_vbap FROM wa_vbap.

ENDLOOP.

 

如果用For All Entries则写法分2步:

SELECT vbeln posnr

FROM lips INTO TABLE it_lips

For All Entries IN it_vbap

WHERE vgbel = it_vbap-vbeln AND

vgpos = it_vbap-posnr AND

vgtyp = ‘C’. “此交货单是根据订单创建的

 

LOOP AT it_vbap INTO wa_vbap.

READ TABLE it_lips INTO wa_lips WITH KEY vgbel = wa_vbap-vbeln

vgpos = wa_vbap-vgpos.

IF sy-subrc = 0.

  wa_vbap-vbeln_vl = wa_lips-vbeln.

  wa_vbap-posnr_vl = wa_lips-posnr.

  MODIFY it_vbap FROM wa_vbap.

ENDIF.

ENDLOOP.

 

对于SELECT SINGLE而言,由于LIPS有个VGBSAP自带索引,每次查询都挺快,即便循环10万次,速度虽然快不了但也没什么大的危害。

对于For All Entries的第一步,的确比SELECT SINGLE快些,本来10万次的SELECT SINGLE,变成了1万次的查询(如果BASIS设置了参数为10),每次查询10个订单行项目。但是第二步就很慢了, 暂估it_lips8万行,则对于it_vbap10万个行项目,有8万个行项目执行READ TABLE语句平均需要4万次才能搜索到it_lips的目标行,另有2万个行项目将读遍it_lips然后才发现没有对应的目标行。所以我们一共需要搜索48亿次,太慢了!

 

在此针对For All Entries的使用提出几点意见:

1)如果是根据某数据量大的内表用For All Entries读取数据量小的配置表,比如TVAK/T006等,那不如把For All Entries直接去掉,把表里的几十条数据全部取出。

2)使用For All Entries时,SELECT语句后面的字段必须包含所查表关键字段。比如上面的vbeln/posnr就是lips的关键字段。如果不含关键字段,比如SELECT lfimg FROM lips For All Entries ***,那么当LIPS中两个条目关键字段不同而lfimg相同时,会被SAP自动过滤掉一条。

3)上面关于性能问题,应该利用BINARY SEARCHSORTED TABLE或者HASHED TABLE来解决。详见下面第四节。

 

 

5,  关于BINARY SEARCH/SORTED TABLE/HASHED TABLE的使用

BINARY SEARCH即二分法查找,在保证内表按查询字段以升序排列的时候,可以采用二分法查找。二分法查找的速度很快,最大查询次数为log2n。以上面的例子来说,如果it_lips事先按vgbelvgpos排好序,则每次查找最多不超过17次。则对于it_vbap10万个行项目,仅100多万次就可以搞定了!

当使用READ TABLE语法时,如果查询字段跟SORTED TABLE的排序开始字段能匹配上,则SAP将自动采用二分法查找。比如it_lipsSORTED TABLE且以vgbelvgpos排序,则当read tablevgbel进行查找时,系统会自动采用二分法。但如果read tablevgpos和其他字段进行查找,由于vgpos并非SORTED TABLE的第一排序字段,系统将采用直线查找,速度会慢很多。总之,SORTED TABLE的排序字段次序也很关键。

 

针对STANDARD TABLE排序后可以进行二分法查找,使用SORTED TABLE也可进行二分法查找,那么二者有什么区别呢?简单来说,由于SORTED TABLE自始至终都保持排序,如果需要对内部进行频繁的插入、删除操作,则不推荐使用SORTED TABLE,性能会很差。而另一方面,如果我们要用的是类似LOOP AT it_lips WHERE vgbel = ** 的语法(而非READ TABLE)时,对于STANDARD TABLE就无法采用二分法查找,或者说会很麻烦。而对于SORTED TABLE,系统会自动采用二分法优化查找过程。

 

至于HASHED TABLE,笔者用得也不太多。查看SAP的标准代码,貌似用得也没很多。理论上HASHED TABLE可以比SORTED TABLE更快些,但需要耗用更大的存储空间。当某程序采用了二分法查找之后,如果效果还不是很理想,建议可以用HASHED TABLE试试。

 

 

【待续】 

阅读(4964) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

2011-10-15 08:18:36

很好很强大,不够for all entries我觉得要看情况,毕竟内存访问比数据库IO快的也不是一点半点的

chinaunix网友2011-07-08 10:16:25

期待中。。。