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 的区别,请在文章下留言。

原文地址:https://cloud.tencent.com/developer/article/2192628

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340