** 本篇文章对上一篇文章做一个补充,探讨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
READ+排序表竟然和使用二分法查找标准表几乎一样的时间
**在SAP文档中有如下介绍:**
_当不加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."--------------------@斌将军--------------------结果:
当然,如果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."--------------------@斌将军--------------------结果:
通过这两篇文章的讲解,希望对读者有所帮助,如发现其中有误,望不吝赐教,有错必纠。