**反例**
** 说明 **
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同号)** ****
**如果喜欢,谢谢转发。**