SAP ABAP长文本读取性能瓶颈诊断与批量优化实战:从READ_TEXT到READ_TEXT_TABLE
1. 当SAP报表遇上长文本性能噩梦的开始相信每个ABAP开发者都遇到过这样的场景一个原本运行良好的物料报表突然因为增加了长文本显示需求而变得奇慢无比。我去年就接手过这样一个项目用户抱怨说点击报表后可以去泡杯咖啡回来发现还在加载。最夸张的一次某工厂的物料主数据报表运行了整整15分钟——这期间用户真的睡着了。问题往往出在循环调用READ_TEXT函数上。传统做法是先用SQL语句获取物料基础数据然后LOOP AT这些数据逐条调用READ_TEXT读取长文本。这种模式会产生N1次数据库查询N是物料数量当物料超过1000条时系统就像在跑马拉松还背着沙袋。长文本存储在SAP的簇表里每次READ_TEXT调用都要解析文本对象参数定位物理存储位置解压CLUSTER数据组装返回结构 这个过程重复上千次不慢才怪。有次我用ST12做跟踪发现90%的时间都耗在READ_TEXT的RFC调用上。2. 性能杀手READ_TEXT的运作内幕2.1 老式函数的三大性能陷阱READ_TEXT就像个老式收音机每次只能调一个台。它的工作流程是这样的LOOP AT material_list. CALL FUNCTION READ_TEXT EXPORTING id GRUN name material_list-matnr IMPORTING text longtext. ENDLOOP.这里藏着三个性能黑洞网络往返开销每次调用都产生RFC通信就像去超市买鸡蛋每次只买一个重复解析成本每次都要重新解析文本对象定义内存碎片化零散的内存分配会增加GC压力我曾测试过读取5000个物料的长文本READ_TEXT方式耗时48秒数据库实际处理时间只有3秒45秒都浪费在RFC通信和重复初始化上2.2 诊断性能瓶颈的实战技巧当报表变慢时按这个顺序排查用ST05跟踪SQL确认是否是基础表查询慢用SAT计时分析定位耗时最长的函数用SE30统计RFC调用次数有个快速判断长文本瓶颈的技巧在代码里临时注释掉READ_TEXT调用如果速度立即恢复正常那问题就找到了。上周帮客户优化时发现一个报表98%的时间都花在读取客户说明文本上。3. READ_TEXT_TABLE的批量革命3.1 新函数的核心理念S/4HANA带来的READ_TEXT_TABLE函数就像集装箱运输DATA: lt_header TYPE TABLE OF thead. 批量准备查询条件 LOOP AT material_list INTO DATA(material). APPEND VALUE #( tdobject MATERIAL tdname material-matnr tdid GRUN ) TO lt_header. ENDLOOP. 一次性批量读取 CALL FUNCTION READ_TEXT_TABLE TABLES text_headers lt_header text_table lt_texts.它的优势在于单次RFC调用所有请求打包发送集群读取优化数据库层会智能合并IO操作内存连续分配减少内存碎片同样的5000条数据测试总耗时降至6秒RFC时间几乎可以忽略数据库处理时间稳定在5秒左右3.2 实现细节的注意事项实际使用时要注意这些坑语言处理如果需要多语言文本要提前构建所有语言的请求APPEND VALUE #(tdspras 1 ... ) TO lt_header. 中文 APPEND VALUE #(tdspras E ... ) TO lt_header. 英文内存控制超大批量时建议分批次处理DATA(lv_batch_size) 1000. DO lines(lt_materials) TIMES. lt_batch lt_materials[ (sy-index - 1) * lv_batch_size 1 TO sy-index * lv_batch_size ]. 处理批次... ENDDO.结果匹配批量返回的结果需要与原始数据关联LOOP AT lt_texts ASSIGNING FIELD-SYMBOL(text). READ TABLE material_list WITH KEY matnr text-tdname ASSIGNING FIELD-SYMBOL(material). IF sy-subrc 0. material-longtext text-content. ENDIF. ENDLOOP.4. 完整优化实战案例4.1 改造前的典型代码这是我从最近项目中提取的典型慢代码SELECT * FROM mara INTO TABLE DATA(lt_mara) WHERE matnr IN s_matnr. LOOP AT lt_mara ASSIGNING FIELD-SYMBOL(mara). 读取中文文本 CALL FUNCTION READ_TEXT EXPORTING client sy-mandt id GRUN language 1 name mara-matnr object MATERIAL IMPORTING text mara-maktx_zh EXCEPTIONS id_not_found 1 OTHERS 2. 读取英文文本 CALL FUNCTION READ_TEXT EXPORTING language E IMPORTING text mara-maktx_en EXCEPTIONS id_not_found 1 OTHERS 2. ENDLOOP.4.2 分步骤优化方案第一步构建批量请求表DATA: lt_text_req TYPE TABLE OF thead. LOOP AT lt_mara ASSIGNING mara. 中文请求 APPEND VALUE #( tdobject MATERIAL tdname mara-matnr tdid GRUN tdspras 1 ) TO lt_text_req. 英文请求 APPEND VALUE #( tdspras E ) TO lt_text_req. ENDLOOP.第二步批量读取文本DATA: lt_texts TYPE TABLE OF tline. CALL FUNCTION READ_TEXT_TABLE TABLES text_headers lt_text_req text_table lt_texts EXCEPTIONS OTHERS 1.第三步结果匹配处理DATA(lt_texts_sorted) lt_texts. SORT lt_texts_sorted BY tdname tdspras. LOOP AT lt_mara ASSIGNING mara. 处理中文 READ TABLE lt_texts_sorted WITH KEY tdname mara-matnr tdspras 1 ASSIGNING FIELD-SYMBOL(text). IF sy-subrc 0. mara-maktx_zh concat_lines_of( table text-lines sep cl_abap_char_utilitiescr_lf ). ENDIF. 处理英文 READ TABLE lt_texts_sorted WITH KEY tdspras E ASSIGNING text. IF sy-subrc 0. mara-maktx_en concat_lines_of( table text-lines sep cl_abap_char_utilitiescr_lf ). ENDIF. ENDLOOP.4.3 性能对比数据在S/4HANA 2022系统实测结果物料数量READ_TEXT方式READ_TEXT_TABLE方式提升倍数1001.2秒0.3秒4x1,00012.8秒1.1秒11x10,000128秒8.5秒15x这个优化案例最终让报表从原来的3分钟缩短到8秒用户再也不用担心看报表时会睡着了。关键是要记住在SAP开发中减少RFC调用次数永远是性能优化的第一法则。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2504136.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!