效率优化以下情况禁用 FORALLENTRIESIN

作者:郑德鼎 约 3 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, CO, Data Engineering, FI, MM, SD, WM, 仓库管理, 开发, 数据工程, 物料管理, 财务, 销售分销
效率优化以下情况禁用 FORALLENTRIESIN - 封面图
效率优化以下情况禁用 FORALLENTRIESIN - 封面图

**反例**

效率优化以下情况禁用 FORALLENTRIESIN - 封面图
效率优化以下情况禁用 FORALLENTRIESIN - 封面图
效率优化以下情况禁用 FORALLENTRIESIN - 封面图
效率优化以下情况禁用 FORALLENTRIESIN - 封面图

** 说明 **

FOR ALL ENTRIES IN执行的时候,WHERE条件的语句在执行的时候,默认是WHERE FIELD1 = XX OR FIELD1 =

XX这样的方式执行的。

如果where条件只用到了内表的一个字段,那么系统会根据 rsdb/prefer_in_tab_opt

参数(RZ11可以查看)的设置,选择是否把OR转为IN,即WHERE FIELD IN ('XX','XX'),这样效率更高。

同时 rsdb/max_in_blocking_ factor还可以控制IN条件里面的元素数量,如果设置为100,而FOR ALL ENTRIES

IN的内表有500行,则SQL会执行5次。

对于上图里的例子,如果LT_MARA的行数很大,比如10万,而系统中 max_in_blocking_factor的值为5,则SQL要执行恐怖的

**2万次** 。

如果你把LT_MARA里的查询字段 _排序、去重_ ,虽然可以 减少 SQL执行次数,但依然不是最优解。

** 结论 **

最优解,就是在这种 查询 **字典表** 数据 的情况下 **放弃使用** FOR ALL ENTREIS

IN和WHERE条件,改为全量取字典。因为查询字典表的全部数据出来也不会很耗时,FOR ALL不仅让代码复杂了,也会让耗时恐怖的增加。

比如你要查询 科目、物料组、采购组、MRP控制者、公司工厂采购销售等组织信息、利润中心、凭证类型、操作人姓名(V_USR_NAME) ,还有其他 很多

的标准的或自定义的字典数据。

甚至去HR表查询 **人员姓名** ,如果员工数量不超过10000,都可以一次取出来作为字典。

FOR ALL ENTRIES IN是个常规写法,但常规不等于万能。

** 拒绝堆屎山代码,从我做起。 **

我的SE38插件工具箱——视频介绍:

** https://www.bilibili.com/video/BV1hP4y1N7Qz/ **

联系286503700获取

> **ABAP文章汇总:**

>

> **https://mp.weixin.qq.com/s/djmMeM0qfDxPPwxbjuJABA**

>

> **Excel文章汇总:**

>

> **https://mp.weixin.qq.com/s/NwJ0SzIrn9hVmaCMo-UYyA**

>

> **网盘永久链接:**

>

> **https://mp.weixin.qq.com/s/f_WwKZdwM-vPEstTjjz_eQ**

**关注公众号,点下方菜单打开上面的链接,更方便哦。**

**笔者微信:** **** **286503700(QQ同号)** ****

**如果喜欢,谢谢转发。**

郑德鼎

关于作者:郑德鼎

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

来源说明:本文内容由「效率优化以下情况禁用FORALLENTRIESIN.md」整理生成,仅用于内部技术分享与学习交流。