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 |
按照这种连续的存储空间来存储。
那么我们到这里看下,行列的优缺点:
- 行存储:我去读数据的时候,按序来读,会从上到下读一行,然后再往下读另外一行。每一行都是存完了再存另外一行。这种情况下,如果我说我的需求是把完整的一条数据取出来,那么这种行存储就明显比列存储快。我就去把表遍历一遍,看我要的是哪条就行了。但是对于列的话,假如我要第二行,那我得先去找02地址的,再去找04地址的,再去找06地址的。我要N个属性遍。
- 列存储:如果我不是要完整的一条。我要找最高的分数。那如果在行存储里,我还是要遍历全表。但是列存储里,我只要找分数这个属性,然后去找它的最大值。或者说我去找班级是二班的有多少个。那么我只要找班级这个属性。实际应用中这种需求是居多的。
总结一下:行存储适用于表条目数少,属性值都很少重复,不需要聚集或不需要快速查询的。
列存储适用于表量大,属性多,有聚集的需求,表列属性多有重复的。
至于说为啥我要查找班级分数最高的,就会很快呢?行表是遍历去找。为啥列表就是直接去找属性了呢?因为列式存储的给属性加了个数据字典。
啥意思呢?
比如对于第二列班级,列表中会有数据字典,数据字典只保存非重复值。
编号 | 班级 |
---|---|
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有两种类型:
- ABAP CDS:就是不管底层数据库是啥,我都能用。是建在ABAP application server上的view。
- 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的过程中,有两个很有用的快捷键:
- Ctrl + Space 自动填充,关键词,模板,变量名方法名。
- 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注解
注解分为几大类:
- 视图注解:@AbapCatalog.sqlViewName: ‘ZBW_SQL_TEST’
@EndUserText.label: ‘ZBW_CDS_TEST’
就在define view的开头 - 元素注解:是view中间的元素,
- 参数注解
- 扩展注解
- 功能注解