ABAP 读取内表行新老语法对比二

作者:斌将军 约 4 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
ABAP 读取内表行新老语法对比二 - 封面图
ABAP 读取内表行新老语法对比二 - 封面图

** 本篇文章对上一篇文章做一个补充,探讨READ+排序表的效率问题 **

> 上一篇文章讲解了READ内表新老语法比较

>

> 斌将军,公众号:斌将军 [ ABAP 读取内表行新老语法对比

> ](https://mp.weixin.qq.com/s?__biz=Mzg5OTg3ODg2MQ==&mid=2247484922&idx=1&sn=e209fc97b1c2674052e9a85efe1fb59a&chksm=c04ddf58f73a564ec97cd6ade445c4293c66d578a2904bda60d296e33e876d7dbbc54c05cd0a#rd)

经过第一篇文章中的测试,如果不用二分法直接READ排序表将会怎样呢,是不是和单独使用READ一个效果呢?

"--------------------@斌将军--------------------"5.测试老语法+排序表------------------------------------DATA:lt_acd_sort TYPE SORTED TABLE OF acdoca WITH NON-UNIQUE KEY rbukrs gjahr belnr docln.lt_acd_sort = lt_acd.GET TIME STAMP FIELD lv_current1.CLEAR:lv_index.LOOP AT gt_acd INTO gs_acd. READ TABLE lt_acd_sort INTO ls_acd WITH KEY rbukrs = gs_acd-rbukrs gjahr = gs_acd-gjahr belnr = gs_acd-belnr docln = gs_acd-docln. IF sy-subrc EQ 0. lv_index = lv_index + 1. ENDIF.ENDLOOP.GET TIME STAMP FIELD lv_current2."--------------------@斌将军--------------------

结果:< 1s

ABAP 读取内表行新老语法对比二 - 封面图
ABAP 读取内表行新老语法对比二 - 封面图

READ+排序表竟然和使用二分法查找标准表几乎一样的时间

**在SAP文档中有如下介绍:**

ABAP 读取内表行新老语法对比二 - 封面图
ABAP 读取内表行新老语法对比二 - 封面图

_当不加BINARY SEARCH,_

• _标准表将会线性搜索_

• _如果搜索的关键字是排序表定义的关键字或包含这些关键字,则排序表会自动进行二进制搜索;否则进行线性搜索_

• _如果搜索的关键字是哈希表定义的关键字或包含这些关键字,则哈希表使用哈希算法搜索;否则进行线性搜索_

所以READ在查询排序表时,如果查询的关键字段等于或包含排序表关键字段,则使用二分查找。

当排序表的关键字段,在READ查询中未使用,则会进行线性搜索,比如:

"--------------------@斌将军--------------------DATA:lt_acd_sort TYPE SORTED TABLE OF acdoca WITH NON-UNIQUE KEY rbukrs gjahr belnr docln.lt_acd_sort = lt_acd. GET TIME STAMP FIELD lv_current1. CLEAR:lv_index. LOOP AT gt_acd INTO gs_acd. READ TABLE lt_acd_sort INTO ls_acd WITH KEY gjahr = gs_acd-gjahr "此处去掉了rbukrs作为搜索条件 belnr = gs_acd-belnr docln = gs_acd-docln. IF sy-subrc EQ 0. lv_index = lv_index + 1. ENDIF. ENDLOOP. GET TIME STAMP FIELD lv_current2."--------------------@斌将军--------------------

结果:

ABAP 读取内表行新老语法对比二 - 封面图
ABAP 读取内表行新老语法对比二 - 封面图

当然,如果READ中未使用的关键字在整个排序表关键字的尾部,则效率仍然不受影响,毕竟READ查询的时候,用到的关键字段已经在前几列完成了排序,至于后几列如何排序,反正READ也不搜索,所以不受影响,比如:

"--------------------@斌将军--------------------DATA:lt_acd_sort TYPE SORTED TABLE OF acdoca WITH NON-UNIQUE KEY rbukrs gjahr belnr docln rldnr rrcty docnr_ld rmvct vorgn."此处在docln后添加了多个字段作为关键字lt_acd_sort = lt_acd. GET TIME STAMP FIELD lv_current1. CLEAR:lv_index. LOOP AT gt_acd INTO gs_acd. READ TABLE lt_acd_sort INTO ls_acd WITH KEY rbukrs = gs_acd-rbukrs gjahr = gs_acd-gjahr belnr = gs_acd-belnr docln = gs_acd-docln."搜索关键字只到docln IF sy-subrc EQ 0. lv_index = lv_index + 1. ENDIF. ENDLOOP. GET TIME STAMP FIELD lv_current2."--------------------@斌将军--------------------

结果:

ABAP 读取内表行新老语法对比二 - 封面图
ABAP 读取内表行新老语法对比二 - 封面图

通过这两篇文章的讲解,希望对读者有所帮助,如发现其中有误,望不吝赐教,有错必纠。

斌将军

关于作者:斌将军

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP读取内表行新老语法对比二.md」整理生成,仅用于内部技术分享与学习交流。