看这个例子View: I_SalesContractItemFlfmtCube
有的地方用的left join, 有的地方用的association,有什么guideline规定何时何处用哪一种技术么?
看这个帮助文档:
help.sap.com/hana/SAP_HA…
Association它指明了两个View之间的关系,如果一个View A中定义了Association到另外一个View B时,View A可以把这个Association作为一种特殊类型的字段暴露在selection list里面,那么当上层的另一个View C使用到View A时,他可以通过View A中暴露的这个Association去取View B中的字段。
也就是说只有当View C会用到View B中的字段时,在Runtime的时候View A就会去做left outer join到View B,当上层的View没有用到View B中的字段时,View A就不会Join View B。这样就能提升了View的性能,因为如果直接使用left outer join,那么View A就肯定会join View B,不管上层会不会用到View B中的字段。Association在底层应该也是用left outer join实现的。
如果两个View中的字段是在Business Logic中是必定会用到的,那么就用Join;如果只是提供一个额外连接,但上层用户有需要时自行去取这些字段,那么就用Association。
我的理解是通过association暴露出来的字段是一种lazy join的behavior,只有当field真正被另一个view用到的时候才会去做join。
本质上,所有的association在runtime时都会被interpret为left out join,当然前提是这个association你在runtime的时候用到了。
从基本规则而言,如果你需要target table/view的(一个或多个)字段直接暴露在当前定义的view里,那么使用join,而如果只是想暴露一个接口,为上层提供resource,那么使用association。
既然说到left out join,我们就不得不提到,left out to one join, 这里的to one会在runtime时根据消费的情况决定是否这个join会真正被执行。比如当target table/view 的字段在消费时(比如在ABAP动态或静态代码里)没有用到,那么这个join会被by pass掉。
前面说association在runtime时也是LOJ,因此,截图里的[0…1]其实也是被被翻译成To one。当然还有[1…1]也是。其效果类似。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":