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