乐趣区

关于sap:SAP-ABAP-CDS-view-里-INNER-JOIN-和-Association-的区别

最近有敌人在我的常识星球里向我发问,SAP ABAP CDS view 的 INNER JOIN 和 Association 的性能能够了解为一样吗?

(对于退出我的常识星球的形式,请移步本文文末)

本文就来聊一聊这个话题。既然 CDS view 里同时反对了 INNER JOIN 和 Association 两种操作,那阐明二者必然存在一些差别。

首先创立一个蕴含 INNER JOIN 的 CDS view,将 sflight 和 spfli 两张表通过独特的 carrid 字段连贯在一起,sqlViewName 取名为 ZJERRYCDSJ.

这个 CDS view 将 sflight 的三个字段和 spfli 数据库表的两个字段 airpfrom 和 airpto 裸露给消费者。

而后咱们用上面这条 ABAP 语句从 CDS view 里仅仅读取来自 sflight 数据库表的两个字段。

DATA: lt_data TYPE TABLE OF ZJERRY_CDS_VIEW_JOIN.

SELECT carrid, connid INTO CORRESPONDING FIELDS OF TABLE @lt_data FROM zjerry_cds_view_join.

咱们开启 ST05 跟踪模式,执行下面的报表,查看生成的 SQL trace,通过 sqlViewName 指定为 ZJERRYCDSJ,即可定位到拜访 CDS view 的那条 SQL 语句。

咱们在 ST05 事物码里抉择 Edit->Display Execution Plan->For Recorded Statement,即可查看到下面那条 SQL 语句在运行时的执行打算:

执行打算如下图所示:

绿色区域的 FDA READ,意思是疾速数据拜访 (Fast Data Access,缩写为 FDA),这是一种在 SAP ABAP 环境中进行数据读写访问的协定。它针对 SAP HANA 为 OPEN SQL SELECT 等语句执行时提供了专门的优化。在疾速数据拜访场景里,SAP ABAP 内表的数据通过一种非凡的形式传输到数据库,处理完毕后返回应用层。FDA 防止了按字段级别 (field-wise) 进行 ABAP 数据复制和数据格式转换的额定开销,缩小资源利用率以进步利用性能。

FDA 从 SAP ABAP 内核 7.42 版本引入,对于个别的 ABAP 开发人员来说是通明的,仅仅可能在 ST05 Execution 里察看到。

上图的执行打算里,咱们在 SELECT 语句里只拜访了来自 sflight 表的 carrid 和 connid 两个字段,然而从执行打算的蓝色区域能察看到,sflight 和 spfli 的数据库表 INNER JOIN 依然产生了。

我集体把这种行为称为 Eager Join(贪心 Join),相似 Angular Feature Module 的 Eager Load(贪心加载)。

在 Eager Join 的场景下,表 Join 肯定会产生,无论被 Join 的表的字段在以后事务里是否会被读取,这造成了不必要的性能开销。在 Angular Feature Load 场景里,以 Cart Feature Module(功能模块) 为例,如果采取默认的贪心加载机制,那么用户即便只是在页面轻易浏览一下商品,购物车模块也会被浏览器加载,这影响了电商页面的首屏加载工夫。

Eager 的反义词当然就是 Lazy,Lazy Load 就是懒加载,延时加载,按需加载。将 Cart Feature Module 配置成 Lazy Load,其表现形式就是直到用户点击增加到购物车按钮,或者间接点击右上角的购物车图标后,才会从浏览器里看到 Cart 功能模块的加载。

同理,CDS view 的 Association 能实现 Lazy Join.

咱们应用下图的代码,创立一个 CDS view,通过 Association,将表 SFLIGHT 和 SPFLI 连接起来。乍一看,实现的性能和之前通过 Join 开发的版本没有任何区别。

咱们编写一段 ABAP 代码来生产这个 CDS view.

在这段 ABAP 代码里,只读取 sflight 数据库表的 carrid 和 connid 两个字段。

DATA: lt_data TYPE TABLE OF ZJERRY_CDS_VIEW_ASS.

SELECT carrid, connid INTO CORRESPONDING FIELDS OF TABLE @lt_data FROM zjerry_cds_view_ass.

从 ST05 的 Trace 中,咱们看不到 spfli 被 Join 的迹象。

将 ABAP 报表稍作批改,不仅读取 sflight 数据库表的字段,而且通过 CDS view 里的名为 _flight 的 Association,读取通过 Association 关联的另一端 spfli 表的 airpfrom 和 airpto 字段。

最初在 ST05 Trace 里,能察看到此时 spfli 数据库表的确通过 LEFT OUTER JOIN 同 sflight 建设了连贯。

如果大家晓得更多对于 CDS view INNER JOIN 和 Association 的区别,请在文章下留言。

退出移动版