ABAP on HANA/CDS view/AMDP 大乱炖

1. HANA的三大杀器

这个标题呢,是我瞎写的。但是内容是正经的。

1.1 内存式数据库

也就是说内存式计算,这个是实时OLAP的前提。也就是啥意思呢?
以前你家冰箱在厨房,要是躺床上饿了,得下床跑到厨房去拿。
现在给你家冰箱嵌卧室了,手一伸够着了。
数据都搞内存里去了。传输的就快了。
不用去硬盘再去拿了。原先大量数据过来要传好久的。现在我直接在内存里取数了。具体我好像这里描述了。这里.

1.2 多核架构

也就是可以大量并行。CPU可以扩展。
以前家里有一个保姆。干啥事都只能一件一件来。
现在你花钱多雇了几个保姆。送娃和做饭可以并行来。以上例子是瞎举的。保姆是请不起的。还是自己干吧。

1.3 列式存储

聚集和查询速度非常快。
一般关系型数据库表都是二维表。是有关系的。有行有列。
比如下面这个表:

学号 班级 姓名 成绩
01 二班 小红阿扎一黑 99
02 二班 小绿阿扎一黑 98

数据库有按行来存储的,也有按列来存储的。
按照最小存储单元为1byte。存储单元都是按地址顺序来排。如果你是按行来存储,那就是这样的(以下是个示例,实际占据的空间是一个字节1byte,int型的占四个字节):

00000001 01
00000010 二班
00000011 小红阿扎一黑
00000100 99
00000101 02
00000110 二班
00000111 小绿阿扎一黑
00001000 98

如果按照列式存储,那就是这样的:

00000001 01
00000010 02
00000011 二班
00000100 二班
00000101 小红阿扎一黑
00000110 小绿阿扎一黑
00000111 99
00001000 98

按照这种连续的存储空间来存储。
那么我们到这里看下,行列的优缺点:

  1. 行存储:我去读数据的时候,按序来读,会从上到下读一行,然后再往下读另外一行。每一行都是存完了再存另外一行。这种情况下,如果我说我的需求是把完整的一条数据取出来,那么这种行存储就明显比列存储快。我就去把表遍历一遍,看我要的是哪条就行了。但是对于列的话,假如我要第二行,那我得先去找02地址的,再去找04地址的,再去找06地址的。我要N个属性遍。
  2. 列存储:如果我不是要完整的一条。我要找最高的分数。那如果在行存储里,我还是要遍历全表。但是列存储里,我只要找分数这个属性,然后去找它的最大值。或者说我去找班级是二班的有多少个。那么我只要找班级这个属性。实际应用中这种需求是居多的。
    总结一下:行存储适用于表条目数少,属性值都很少重复,不需要聚集或不需要快速查询的。
    列存储适用于表量大,属性多,有聚集的需求,表列属性多有重复的。

至于说为啥我要查找班级分数最高的,就会很快呢?行表是遍历去找。为啥列表就是直接去找属性了呢?因为列式存储的给属性加了个数据字典。
啥意思呢?
比如对于第二列班级,列表中会有数据字典,数据字典只保存非重复值。

编号 班级
1 一班
2 二班

这个数据字典会另外存储,实际列表存储的时候是以编号代替字符的。

00000001 01
00000010 02
00000011 2
00000100 2
00000101 小红阿扎一黑
00000110 小绿阿扎一黑
00000111 99
00001000 98

可以节省空间,毕竟字符是8个byte,有些长的字符那就更占空间了。比如二班这两个汉字,4个字符,32个byte。如果你用INT来存储编号,那是只有一个2,那就是4个byte。一个就省了28个byte。

1.3.1 数据压缩

默认列式存储会自动压缩,还有一些高级压缩涉及到前缀译码,运行长度译码等等。自动压缩就是上面那个列式存储的压缩。

1.3.2 并行处理

对于列式存储,如果我们只要一个属性的什么最大值啦,计算个数啦,总计等等的。由于CPU的可扩展性,在HANA中可以由多核CPU并行处理不同的列需求。
同一列也可拆分成不同的并行处理。比如二班三班的。

1.3.3 聚集和索引

到了HANA上是不需要聚集和索引了的。可能大家也听说过了,是因为HANA上处理速度都那么快了。要啥聚集和索引啊。
注意这里是不需要了,不是说不能建了。
为啥我们一开始要聚集。那还不是性能的问题。
这就回到了为啥OLTP和OLAP要分开。如果我们直接在OLTP上搞分析,那不行么?就是因为人家一方面在录入订单,你一方面在查询。一个写,一个读。大家都在访问数据库,如果系统有1000个用户都在这么搞,这么多次点击,这么多次要求,我都得建立链接,解析SQL,执行请求,系统进程扛不住啊,也不知道该响应谁的,大家会把系统数据搞的一团糟。所以OLAP分离成BW了,就先每天晚上跑处理链,把数据复制过来一把,然后再读吧,也别搞实时了。至少数据是准确的。
但是HANA为啥就不需要聚集了呢?因为人家可以在任何行项目表上建实时聚集视图你搞吧,随便你这会是要保存个订单还是修改个订单,你弄啥我就给你投影出去啥。人家都能从我视图上看到实时数据。
为啥HANA不需要索引了呢?一般行存储的表需要索引,要不然遍历起来费劲。但是我都搞列式存储了。不按序来查找数据了,我也就不需要索引了。
聚集和索引的去除,节省了一大部分处理聚集和索引的应用代码。

1.3.4 代码下移

至于代码下移又是啥意思呢?就针对我们BW来讲,如果我要在转换里面结合其他表的数据,我为了不频繁访问数据库,我都是把能结合的表先结合了,把数据都全拉过来到应用服务器上,然后再操作这些取过来的数据。虽然说有时候内表过大取数很费时,但是我有了这所有的数据,然后再操作我想要的结果就方便多了。总好过去我一会去数据库取一点数。
但是到HANA这,需要你代码下移到数据库了。啥意思?
就是你别把数据都取到应用服务器上了,我数据库不怕你取,你要啥你就取啥,你在数据库都精准的取好你要的数据,我只会返还给你你需要的那一部分数据。

就是说这个结果集会很小,多用用WHERE和HAVING,SORT吧。传输的数据量会很小,SELECT with 字段名,别*。不必要的查询结果就没必要传输了。别弄那个select的循环了,弄弄join和subquery限制数据量。
这一下就减轻了数据库存储和网络传输到应用服务器的负担。有时候还可以用用缓存。

2. CDS 概念

在看CDS之前,先看一下ABAP开发环境

2.1 ABAP 开发环境

先进入eclipse的ABAP perspective。
说实话这个perspective我也不知道咋翻译。就是这个perspective下面有好多。
我装的这个eclipse是什么Java developer啥的。这个IDE下面就有好多perspective,反正不管了。这些对于我够用了。
在这里插入图片描述
点击了之后在右上角能看到。最左边那个带加号的也可直接加perspective。就这个开发环境我看支持BW啊,ABAP啊,JAVA啊,HANA啊的。
在这里插入图片描述
创建了ABAP的project之后,也就是说通过把ABAP后台系统和eclipse的开发环境关联上了,通过这个eclipse平台,创建,运行,测试你ABAP系统repository里的对象都可以。

也就是现在的面向对象ABAP在eclipse里面的编程环境搞。
在这里插入图片描述
进入ABAP环境就是它下面啥呢?就像ABAP se80下面好多东西。
这一个个package下面。有新的CDS啦,有数据字典啦,有类,接口,程序,功能组,BADI 啥啥啥。
在这里插入图片描述
在这里插入图片描述
然后就是经常去outline看看,这个里面就是你点了什么对象,就会给个对象里的详细信息。
还有最顶上一系列按钮,然后和最底下一系列按钮都挺有用的。
在这里插入图片描述
在这里插入图片描述

2.2 OPEN SQL语句

SQL结构化查询语句,其实分三个子语句:

DDL 定义 DML 操作 DCL 控制(权限相关)
create table/alter table select/insert grant
create view/drop table update/delete revoke

我们在ABAP里面用的是OPEN SQL,只涉及到DML语句。
DDL这些都是在数据字典里弄。而DCL呢,好像是BASIS来搞。我们在SE11里面建透明表,激活了之后后台系统会生成建表语句。
而在ABAP里面用的open SQL其实是简化版本的,像现在在HANA里面的computed columns啦,case啦,right outer join啦,UNION啦,DAYS_BETWEEN()都不能用。而且你也不能去open HANA的 view和procedure。这些都是限制啊。
但是7.4SP5之后的open SQL可以用新语法了:
arithmetic/aggregation/comparative functions这些是用来支持代码下推的。SP5之后上面的功能也都是支持的。
那有啥区别呢?
就新的select的字段后加逗号分隔,然后主变量前加@。就它OPEN SQL自己的变量。建议用新的OPEN SQL。别跟旧的混了。
在这里插入图片描述
为啥讲这个?因为CDS view它用的是新的OPEN SQL语句。
那么再回到DDL去,如果我们用ABAP数据字典建view,那么跟CDS view会有啥差别?
建过的都知道。那就只能用inner join啊。你就不能在里面搞什么计算,聚集,分组啥的。

2.3 CDS 到底是啥

Core Data Services 核心数据服务。是数据+服务。

要知道你去ABAP创建字段的时候,先去创建数据元素 data element,里面是field,label,短描述长描述。其实这个field还要再进一层去建domain,domain里面是技术属性 data type和length 。这个是DDL层。在CDS里面同样也有这个:
那么CDS包含啥?

DDL 定义 Query Language 查询 DCL 控制(权限相关)
model,从语义层获取数据 open SQL 访问CDS view CDS权限定义,集成旧的权限概念
扩展native SQL 扩展SQL 建模和声明

好了,大致包含上面。
那么这个DDL干啥?
就是说数据库表,视图这些呢,有个名字叫做CDS实体。那这些东西,你不在SE11里面弄,可以直接DDL弄。
而QL,如果你用CDS DDL弄了视图,那么你就可以用QL来使用这个视图。当然你这个视图在其他CDS view里面也可以被用。
最后一个DCL,控制CDS实体的权限的。以前的权限是通过权限相关对象来搞,要么是你执行的时候后台搞,要么你用语句来authority check。这个CDS实体权限也就是当你用open SQL去对CDS view进行操作的时候,ABAP运行会自动检查。

2.4 CDS 类型

在看CDS类型之前呢,要知道跟着CDS来的有两个东西:

  • 数据定义 data definitions
    DDL source,就是CDS view或者CDS table的定义,这个你在GUI里面能看到,但是要想修改,只能在eclipse里面。
  • 权限控制 access controls
    DCL source,在程序访问CDS view 或者CDS table的时候自动检查的权限规则的定义。也是只能在eclipse里面修改。
    在这里插入图片描述
    下面来到CDS类型:
    CDS有两种类型:
  1. ABAP CDS:就是不管底层数据库是啥,我都能用。是建在ABAP application server上的view。
  2. HANA CDS:直接在HANA数据库上面弄的,用来从头搞建模的。一般没有BW,直接从底层HANA XS建模。

那么CDS view和传统的ABAP view有啥区别?

ABAP View CDS View
支持所有数据库
支持查询 内连接 内连接,外连接,union
支持计算 不支持 支持aggregation,grouping,calculation
支持子view 不支持 可以基于一个CDSview创建另一个

在这里插入图片描述

CDS 同时支持annotations,这个是啥呢?就是一些语义信息的添加。接下来会写。
你也可以DCL定义权限规则。
CDS里还可以用associations关联。这个会自动根据你的select语句转换为join。

2.5 创建CDS view

CDS view 的创建很简单,包上右键。
在这里插入图片描述
在这里插入图片描述
默认有好多模板可以选择,但是为了方便起见,一般都直接选择最简单的。
在这里插入图片描述
到这里呢,有个要注意的地方了。我们用DDL去定义View的时候,一旦这个view激活,将会生成两个view,一个是SQL view,就是第一行@sqlVIEWNAME。另一个是CDS VIEW)。说实话,我也不知道这个SQL View用来干啥的。这个SQL View可以在ABAP数据字典里看到。CDS View只能在eclipse里面看到。
你可以把SQL View理解为CDS View在数据字典的代表。CDS View本身是不存在于数据字典的(下面那个CDS实体有误,不应该在数据字典的框框里),它只能被open SQL访问。

在这里插入图片描述
一般情况下,你建的DDL名字和你建的CDS View名字要一样。然后SQL View无所谓。
在这里插入图片描述
在这里插入图片描述

以@开头的是一些annotation,就是注解,用来添加一些附加信息。怎么缓存啦,怎么扩展啦。这些注解都是SAP预定义好的。@SQLViewNAME这个是强制的。这个在实际应用过程中才能慢慢贯通。在这里插入图片描述
看看人家的一个例子:
在这里插入图片描述
还可以有参数:
在这里插入图片描述
在这里插入图片描述
还可以Append view。可以说是功能很强大了。
在这里插入图片描述
在创建CDS View的过程中,有两个很有用的快捷键:

  1. Ctrl + Space 自动填充,关键词,模板,变量名方法名。
  2. Ctrl + 1 快速修复error,warning。创建方法implementation,方法定义,interface实现等等。

3. CDS 实战

在此之前,找SAP的表练习,先把一些SAP给的表给填充一下:
在这里插入图片描述

在这里插入图片描述
用这个program:
SAPBC_DATA_GENERATOR
在这里插入图片描述
在这里插入图片描述
好了,在创建DDL之前,你要知道一些格式问题:

关键字,要么全大写,要么全小写,要么首字母大写。DDL名字就全大写吧。
// 后面注释掉你想注释的东西
/* 里面囊括要注释的 */
CDS view名字最长30字符,SQL view 最长16字符,两个最好不一样。
数字小数得加0 , 不能说写成.5要写全成0.5 字符数字加’0.5’。

语法推荐:

define view ***
as select from ***
{
    
    
key ***

}

在project右键新建:
在这里插入图片描述

在这里插入图片描述
先放到本地包里去。然后下一步好多模板可以选。不选的话默认view。
在这里插入图片描述
在这里插入图片描述
F8预览数据。
在这里插入图片描述
预览的页面里有SQL Console,还可以对CDS View进行进一步操作。
在这里插入图片描述
在这里插入图片描述
好了,接下来可以去看看你的SQL View了,那就直接在eclipse里面去看吧。
在这里插入图片描述
MANDT也给带上来了。
在这里插入图片描述
右键CDS View看到很多有用的信息:
这个自己点进去看看。anno
在这里插入图片描述

3.1 Annotation注解

注解分为几大类:

  1. 视图注解:@AbapCatalog.sqlViewName: ‘ZBW_SQL_TEST’
    @EndUserText.label: ‘ZBW_CDS_TEST’
    就在define view的开头
  2. 元素注解:是view中间的元素,
  3. 参数注解
  4. 扩展注解
  5. 功能注解

3.2 Case 语句

3.3 数学计算

3.4 字符串表达

3.5 货币转换

3.6 聚集语句

3.7 Join

3.8 Union

3.9 参数

3.10 作为子CDS View

3.11 CDS View中的association关联

3.12 扩展CDS View

3.13 CDS权限

4. AMDP

猜你喜欢

转载自blog.csdn.net/weixin_45689053/article/details/121744872