【效率优化】以下情况,禁用FOR ALL ENTRIES IN

反例

图片

图片

说明

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是个常规写法,但常规不等于万能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值